Laravelでルーティングをすっきり書く方法

初めまして、6月に入社しましたエンジニアの山崎です。

前職はWEB制作会社でフロントエンドのエンジニアとして働いていましたが、 最近はLaravelでのバックエンドでの開発がメインになってきたので、今日はLaravelのルーティングのことについて書こうと思います。

例えばあなたが、laravelで管理者のみが投稿できるブログシステムを開発していたとします。 管理画面でブログの投稿、作成、編集、削除などのルートをまとめて定義したい際に、 routes/web.phpで下記のようにresourcesメソッドを使って記述する事によってRESTFULな7つのURLを簡単に自動作成することができます。

Route::resource('/admin/posts', 'Admin\PostsController');

この状態で下記のコマンドを打つとURLやルート名、対象アクションなどが自動生成されているのが分かると思います。

php artisan route:list

f:id:asahi-yamazaki:20180731201949p:plain

ルート名に接頭辞をつける

ただ、ユーザー画面側にもブログの一覧ページのルートを作成する場合新しくpostsControllerを作成し(namespaceはadminと被らないように定義)

    Route::get('/posts', 'Front\PostsController@index')->name('posts.index');

のようにルートを定義すると、さきほど作ったルート名が管理画面側と被ってしまいます。。 こういった自体を防ぐために、resourcesで定義したルーティングでも、admin.などの接頭辞をまとめてつけるためにはこのようにすると実現できます。

Route::name('admin.')->group(function (){
    Route::resource('/admin/posts', 'Admin\PostsController');
});

このように書くことによって、Route::name('admin.')->group...で囲まれたルーティングのルート名に全てadmin.という接頭辞をつけることができます。

ルートのURLに接頭辞をつける

そしてブログの管理画面にカテゴリー管理機能を作成したいと思ったら同じように

Route::resource('/admin/categories', 'Admin\CategoriesController');

追記すれば、同じようにカテゴリーの投稿、作成、編集、削除などのルートをまとめて定義することができますが、 ページが増えていった場合の管理の事を考えるとurlの/admin/などのURLの共通の記述はできるだけ省きたいと思います。 prefixメソッドというものを使ってさきほどの記述をこのように修正します。

Route::prefix('admin')::name('admin.')->group(function (){
    Route::resource('/posts', 'Admin\PostsController'); // /adminという記述を消した
    Route::resource('/admin/categories', 'Admin\CategoriesController'); // /adminという記述を消した。
});

そうすることによって、Route::prefix('admin')::name('admin.')... で囲まれた全てのルートのURLが/adminから始まるようになります。

このように書くと共通処理をまとめて管理しやすいだけではなく、ページ間の親子関係が非常に分かりやすくなりますよね。

WEBアプリケーションの開発をやってて思うのは、サイトが大規模になるほど 開発をする上で、ページ構造などの設計が非常に重要になってなってきます。

今回書いたものはごく一部にすぎませんが、 フレームワークの心臓部分であるrouteファイルをすっきりと書くことによって 少しでも開発の効率に役立つのではないかと思っています。