こんにちは、JeffTechです。
説明
ルーティングする時に何かと出てくるgroupやprefix、middleware、namespace、asについて説明していきます。
この記事で実現できること
- routes/web.phpやroutes/api.phpに書いてあることが理解できるようになる
開発環境
- OS:MacOS Catalina
- PHP:7.3
- Laravel:6.2
実装
今回使用する例
<?php
Route::get('post/index', 'PostController@index')->name('posts.index');
Route::get('post/create', 'PostController@create')->name('posts.create');
Route::post('post/store', 'PostController@store')->name('posts.store');
Route::get('post/show/{post}', 'PostController@show')->name('posts.show');
Route::get('post/edit/{post}', 'PostController@edit')->name('posts.edit');
Route::post('post/update/{post}', 'PostController@update')->name('posts.update');
Route::post('post/destroy/{post}', 'PostController@destroy')->name('posts.destroy');
Route::get('user/index', 'Admin\UserController@index')->name('users.index');
Route::get('user/create', 'Admin\UserController@create')->name('users.create');
Route::post('user/store', 'Admin\UserController@store')->name('users.store');
Route::get('user/show/{user}', 'Admin\UserController@show')->name('users.show');
Route::get('user/edit/{user}', 'Admin\UserController@edit')->name('users.edit');
Route::post('user/update/{user}', 'Admin\UserController@update')->name('users.update');
Route::post('user/destroy/{user}', 'Admin\UserController@destroy')->name('users.destroy');
上記のようなルーティングがされている時を例にして、説明していきます。
groupとprefixについて
groupは、ある規則性を持ったルーティングを一つのまとまりにするために使います。
prefixは、URIのプレフィックスを設定することができます。
今回の例を使用するとこんな感じになります。
<?php
Route::group(['prefix' => 'post'], function () {
Route::get('index', 'PostController@index')->name('posts.index');
Route::get('create', 'PostController@create')->name('posts.create');
Route::post('store', 'PostController@store')->name('posts.store');
Route::get('show/{post}', 'PostController@show')->name('posts.show');
Route::get('edit/{post}', 'PostController@edit')->name('posts.edit');
Route::post('update/{post}', 'PostController@update')->name('posts.update');
Route::post('destroy/{post}', 'PostController@destroy')->name('posts.destroy');
});
Route::group(['prefix' => 'user'], function () {
Route::get('index', 'Admin\UserController@index')->name('users.index');
Route::get('create', 'Admin\UserController@create')->name('users.create');
Route::post('store', 'Admin\UserController@store')->name('users.store');
Route::get('show/{user}', 'Admin\UserController@show')->name('users.show');
Route::get('edit/{user}', 'Admin\UserController@edit')->name('users.edit');
Route::post('update/{user}', 'Admin\UserController@update')->name('users.update');
Route::post('destroy/{user}', 'Admin\UserController@destroy')->name('users.destroy');
});
groupとprefixを使う前と後のルーティングを$ php artisan route:listを使って見比べてみてください。
全く違いがないと思います。
asについて
asは、$ php artisan route:listしたときのNameにプレフィックスを設定することができます。
今回の例を使用するとこんな感じになります。
<?php
Route::group(['as' => 'posts.'], function () {
Route::get('post/index', 'PostController@index')->name('index');
Route::get('post/create', 'PostController@create')->name('create');
Route::post('post/store', 'PostController@store')->name('store');
Route::get('post/show/{post}', 'PostController@show')->name('show');
Route::get('post/edit/{post}', 'PostController@edit')->name('edit');
Route::post('post/update/{post}', 'PostController@update')->name('update');
Route::post('post/destroy/{post}', 'PostController@destroy')->name('destroy');
});
Route::group(['as' => 'users.'], function () {
Route::get('user/index', 'Admin\UserController@index')->name('index');
Route::get('user/create', 'Admin\UserController@create')->name('create');
Route::post('user/store', 'Admin\UserController@store')->name('store');
Route::get('user/show/{user}', 'Admin\UserController@show')->name('show');
Route::get('user/edit/{user}', 'Admin\UserController@edit')->name('edit');
Route::post('user/update/{user}', 'Admin\UserController@update')->name('update');
Route::post('user/destroy/{user}', 'Admin\UserController@destroy')->name('destroy');
});
asを使う前と後のルーティングを$ php artisan route:listを使って見比べてみてください。
全く違いがないと思います。
namespaceについて
namespaceは、コントローラのパスを共通化することができます。
<?php
Route::get('post/index', 'PostController@index')->name('posts.index');
Route::get('post/create', 'PostController@create')->name('posts.create');
Route::post('post/store', 'PostController@store')->name('posts.store');
Route::get('post/show/{post}', 'PostController@show')->name('posts.show');
Route::get('post/edit/{post}', 'PostController@edit')->name('posts.edit');
Route::post('post/update/{post}', 'PostController@update')->name('posts.update');
Route::post('post/destroy/{post}', 'PostController@destroy')->name('posts.destroy');
Route::group(['namespace' => 'Admin'], function () {
Route::get('user/index', 'UserController@index')->name('users.index');
Route::get('user/create', 'UserController@create')->name('users.create');
Route::post('user/store', 'UserController@store')->name('users.store');
Route::get('user/show/{user}', 'UserController@show')->name('users.show');
Route::get('user/edit/{user}', 'UserController@edit')->name('users.edit');
Route::post('user/update/{user}', 'UserController@update')->name('users.update');
Route::post('user/destroy/{user}', 'UserController@destroy')->name('users.destroy');
});
PostControllerは、app/Http/Controllers配下にあるため、namespaceの設定は特にいりません。
UserControllerは、app/Http/Controllers/Admin配下にあるため、Admin部分をnamespaceで上記のように設定することができます。
namespaceを使う前と後のルーティングを$ php artisan route:listを使って見比べてみてください。
全く違いがないと思います。
middlewareについて
middlewareは、各routeにmiddlewareを割り当てることができます。
middlewareの説明は省きますが、ログインしているかの判定をしてくれるauthミドルウェアを今回は例として設定していきます。
<?php
Route::get('post/index', 'PostController@index')->name('posts.index');
Route::get('post/show/{post}', 'PostController@show')->name('posts.show');
Route::group(['middleware' => 'auth'], function () {
Route::get('post/create', 'PostController@create')->name('posts.create');
Route::post('post/store', 'PostController@store')->name('posts.store');
Route::get('post/edit/{post}', 'PostController@edit')->name('posts.edit');
Route::post('post/update/{post}', 'PostController@update')->name('posts.update');
Route::post('post/destroy/{post}', 'PostController@destroy')->name('posts.destroy');
Route::get('user/index', 'Admin\UserController@index')->name('users.index');
Route::get('user/create', 'Admin\UserController@create')->name('users.create');
Route::post('user/store', 'Admin\UserController@store')->name('users.store');
Route::get('user/show/{user}', 'Admin\UserController@show')->name('users.show');
Route::get('user/edit/{user}', 'Admin\UserController@edit')->name('users.edit');
Route::post('user/update/{user}', 'Admin\UserController@update')->name('users.update');
Route::post('user/destroy/{user}', 'Admin\UserController@destroy')->name('users.destroy');
});
$ php artisan route:listを行うと、middlewareのところに、posts.indexとposts.show以外にauthと付いてるのがわかると思います。
つまり、このようにルーティングすると、postの一覧画面(posts.index)とpostの詳細画面(posts.show)以外のページを見るためには、ログインが必要になります。
全部をまとめて書いてみた
group、prefix、as、namespace、middlewareの全部盛りをするとこんな感じになります。
<?php
Route::group(['prefix' => 'post', 'as' => 'posts'], function () {
Route::get('index', 'PostController@index')->name('index');
Route::get('show/{post}', 'PostController@show')->name('show');
});
Route::group(['middleware' => 'auth'], function () {
Route::group(['prefix' => 'post', 'as' => 'posts.'], function () {
Route::get('create', 'PostController@create')->name('create');
Route::post('store', 'PostController@store')->name('store');
Route::get('edit/{post}', 'PostController@edit')->name('edit');
Route::post('update/{post}', 'PostController@update')->name('update');
Route::post('destroy/{post}', 'PostController@destroy')->name('destroy');
});
Route::group(['prefix' => 'user', 'as' => 'users.', 'namespace' => 'Admin'], function () {
Route::get('index', 'UserController@index')->name('index');
Route::get('create', 'UserController@create')->name('create');
Route::post('store', 'UserController@store')->name('store');
Route::get('show/{user}', 'UserController@show')->name('show');
Route::get('edit/{user}', 'UserController@edit')->name('edit');
Route::post('update/{user}', 'UserController@update')->name('update');
Route::post('destroy/{user}', 'UserController@destroy')->name('destroy');
});
});
$ php artisan route:listをすると、最初のルーティング例と全く変わらないことがわかると思います。
最後に
改善点やこういうのあるよ!というのがありましたら、どんどんコメント下さい!
少しでも役に立った!という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑
役に立たなかった時は、怒らないでコメント頂けますと幸いです笑
Twitterもやってますので、よかったら見てみてくださいね!
https://twitter.com/jefftechsaku