LaravelのRoute設定で、同一階層(prefix)の中で認証あり、なしを分ける方法

LaravelのRoute設定を効率的にする方法をご紹介していきます。

一定慣れている方であれば、
・ディレクトリをまとめるために:prefix
・認証処理をまとめるために: middleware(‘auth’)
などを使うかたもいると思います。

これらを使う際に、同じディレクトリ階層だけども、認証が必要なページと、不要なページどちらもある、といったケースでの記述方法を紹介していきます。

やり方は色々とあります。

例えば、下記です。

 
Route::prefix('/article')->name('rec.')->group(function () {

    Route::get('/top', 'ArticleController@rec_top')->name('top');
    Route::get('/tag/{tag_id}', 'ArticleController@tag')->name('tag');

    Route::middleware('auth')->group(function () {
        Route::get('/postadd', 'ArticleController@postadd')->name('postadd');
        Route::post('/postdone', 'ArticleController@postdone')->name('postdone');
        });
});
 

まずは、下記のprefixで括ってしまいます。

 Route::prefix('/article')->name('rec.')->group(function () { }

その中に、

 Route::middleware('auth')->group(function () { }

括られるものと、括られないもので、認証あり、なしを分けていきます。

Laravel Routeにnameを設定・使い方

Laravelでrouteを利用して、viewを呼び出す際に、Routeにnameを設定する方法を紹介します。

routes\web.php(Routeを設定しているファイル)で、nameを設定します。

 Route::get('/profile', 'mypageController@profile')->name('profile');

記載方法はRouteの最後に、
->name(route名称)でrouteの名称を設定することが出来ます。

nameを設定するメリットについては、Qiitaで分かりやすく解説している方がいたので、ご確認下さい。
Laravel使うならrouteには名前をつけたほうが良い

もう少し使い方について解説します。
Routeでのname設定は、名称を設定しただけです。
これを実際にnameを呼び出して使う方法を紹介します。

routeを使うときは、view bladeの中から呼び出します。

例えば、href にて、リンク先を/profileに設定したい際には、
先ほど、設定したnameを呼び出すカタチで下記のようにリンクに設定します。

<a class="nav-link" href="{{ route('profile') }}">Profile</a>

で、この例だと、ただ、リンクに飛ばしているだけじゃないか、と思うかもしれません。

ここで実験して欲しいのですが

Route:

 Route::get('/profile', 'mypageController@profile')->name('profile.gogogo');

View:

<a class="nav-link" href="{{ route('profile.gogogo ') }}">Profile</a>

と設定しても、/profileへリンクされるのです。
nameはただRouteを接続してくれているだけです。
Routeに設定してある、/profileへの接続は変わりません。

もう一点、私が少し混乱したことについて追記します。
Route設定で、group設定を使う人も多くいると思います。

例えば、下記のようにRoute設定した場合

Route::name('admin.')->group(function () {
   Route::get('/profile', 'mypageController@profile')->name('profile'); 
});

Viewでname を使って、Routeを呼び出す方法は

<a class="nav-link" href="{{ route(' admin.profile') }}">Profile</a>

group 化のname設定によって、nameがadmin.XXXXと設定する必要が出てきます。