207
203

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel初心者に知って欲しいルーティングの見やすい書き方とあれこれ

Last updated at Posted at 2020-08-05

ルーティング綺麗に書いた方が見やすくない?

Laravelでいうroutes/web.phpのこと
初学者のコード見てるともう少しすっきり書けるのになー
そもそも使い方があんまり分からないのかな?と思い記事にする事にしました

そもそもどういう仕組み

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_293438_2c0af10e-1ee8-79e3-1b8c-53069c92e6ae.png

HTTP動詞

postだったりgetだったりresourceとかその時のHTTP動詞を指定

URLのパス

定義した文字にアクセスした時に適用されるルート

コントローラー名

app/Http/Controllers/の中で定義したいコントローラーを指定

メソッド名

上記で設定したコントローラー内のメソッドを指定

早速見やすい書き方講座

一般的な例としてユーザーが一般ユーザーと管理者で分かれており、それぞれにTOPページとCRUDページ(投稿・一覧・更新・削除・あと詳細)があるという構成です

良くある例

web.php
// 一般ユーザー
Route::group(['middleware' => 'auth:user'], function() {
    Route::get('home', 'User/HomeController@index')->name('user.home.index');
    Route::get('post', 'User/PostController@index')->name('user.post.index');
    Route::get('post/show/{id}', 'User/PostController@show')->name('user.post.show');
    Route::get('post/create', 'User/PostController@create')->name('user.post.create');
    Route::post('post/store', 'User/PostController@store')->name('user.post.store');
    Route::get('post/edit/{id}', 'User/PostController@edit')->name('user.post.edit');
    Route::post('post/update/{id}', 'User/PostController@update')->name('user.post.update');
    Route::post('post/destroy/{id}', 'User/PostController@destroy')->name('user.post.destroy');
});

// 管理者ユーザー
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
    Route::get('admin/post', 'Admin/PostController@index')->name('admin.post.index');
    Route::get('admin/post/show/{id}', 'Admin/PostController@show')->name('admin.post.show');
    Route::get('admin/post/create', 'Admin/PostController@create')->name('admin.post.create');
    Route::post('admin/post/store', 'Admin/PostController@store')->name('admin.post.store');
    Route::get('admin/post/edit/{id}', 'Admin/PostController@edit')->name('admin.post.edit');
    Route::post('admin/post/update/{id}', 'Admin/PostController@update')->name('admin.post.update');
    Route::post('admin/post/destroy/{id}', 'Admin/PostController@destroy')->name('admin.post.destroy');
});

何だか全体的に記述が多いですよね...
これをもう少し見やすくしていきましょう。

今回提唱したい例

web.php
// 一般ユーザー
Route::middleware('auth:user')->namespace('User')->name('user.')->group(function() {
    Route::resource('home', 'HomeController', ['only' => 'index']);
    Route::resource('post', 'PostController');
});

// 管理者ユーザー
Route::middleware('auth:admin')->namespace('Admin')->prefix('admin')->name('admin.')->group(function() {
    Route::resource('home', 'HomeController', ['only' => 'index']);
    Route::resource('post', 'PostController');
});

かなりすっきりしました!
仕組みを解説していきます。

ルートグループのメソッドチェーン

良く見られる配列で指定するルートグループの書き方は実はLaravel5.3までの書き方で、
それ以降は->メソッドチェーンで定義するのが主流です!

古い例

web.php
Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function () {
    //
});

新しい例

web.php
Route::prefix('admin')->middreware('auth:admin')->group(function () {
    //
});

名前空間

ルートグループのnamespaceを使用する事でそのグループ内に定義したルート全てに名前空間が適用されます。
そのためわざわざルート毎にAdmin/と付ける必要がなくなります。

古い例

web.php
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});

新しい例

web.php
Route::middleware('auth:admin')->namespace('Admin')->group(function() {
    Route::get('admin/home', 'HomeController@index')->name('admin.home.index');
});

ルートプレフィックス

ルートグループのprefixを使用する事でそのグループ内に定義したルート全てにURIを指定することができます。
そのためわざわざルート毎にURIのパスをadmin/と付ける必要がなくなります。

古い例

web.php
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});

新しい例

web.php
Route::middleware('auth:admin')->namespace('Admin')->prefix('admin')->group(function() {
    Route::get('home', 'HomeController@index')->name('admin.home.index');
});

ルート名

ルート名使ってますか??
意外と便利なので使うようにしましょう!

説明はかずへいさんの記事に任せます!
[Laravel使うならrouteには名前をつけたほうが良い]
(https://qiita.com/kazuhei/items/935257b0d72fa314d461)

ルートグループのnameを使用する事でそのグループ内に定義したルート全てにルート名を指定することができます。
そのためわざわざルート毎にnameをadmin.と付ける必要がなくなります。

古い例

web.php
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});

新しい例

web.php
Route::middleware('auth:admin')->namespace('Admin')->prefix('admin')->name('admin.')->group(function() {
    Route::get('home', 'HomeController@index')->name('home.index');
});

resource

多分初学者の方は一番ここに興味持たれたのではないでしょうか。
resourceはリソースコントローラーと呼ばれ、一般的なCRUD(投稿・一覧・更新・削除・あと詳細)操作を予めLaravel側が用意してくれるというものです。

web.phpではHTTP動詞をRoute::resourceとする事で以下のメソッドを定義した扱いとなります。

  • index(一覧)
  • show(詳細)
  • create(作成画面)
  • store(作成処理)
  • edit(編集画面)
  • update(編集処理)
  • destroy(削除処理)

そのためこの様に行を短縮出来たんですね!

古い例

web.php
    Route::get('admin/post', 'Admin/PostController@index')->name('admin.post.index');
    Route::get('admin/post/show/{id}', 'Admin/PostController@show')->name('admin.post.show');
    Route::get('admin/post/create', 'Admin/PostController@create')->name('admin.post.create');
    Route::post('admin/post/store', 'Admin/PostController@store')->name('admin.post.store');
    Route::get('admin/post/edit/{id}', 'Admin/PostController@edit')->name('admin.post.edit');
    Route::post('admin/post/update/{id}', 'Admin/PostController@update')->name('admin.post.update');
    Route::post('admin/post/destroy/{id}', 'Admin/PostController@destroy')->name('admin.post.destroy');

新しい例

web.php
Route::resource('post', 'PostController');

またresourceはname()も勝手に付与してくれるため、その煩わしさもなくなります!
とっても便利ですね!

最後に

今回は短く書くことで興味を引く作戦でしたが、短ければ良いコードというわけではない。
読みやすく、改修が容易に済むコードを心掛けましょう()

207
203
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
207
203

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?