開発しているプログラムの機能が増えてくると、必然的に定義するrouteの数が増えてきます。特に、マルチ認証ともなると、関わるプレイヤーの分だけで倍増する可能性があります。
例えば、ECのプロジェクトで、会員と管理者がプレイヤーとすると、ログインだけでも2通りのURIが必要となり、routeの設定は以下のように4つ必要となります。
Route::group(['middleware' => 'web'], function () { Route::get('user/login', 'User\Auth\AuthController@showLoginForm'); Route::post('user/login', 'User\Auth\AuthController@login'); Route::get('admin/login', 'Admin\Auth\AuthController@showLoginForm'); Route::post('admin/login', 'Admin\Auth\AuthController@login'); });
実際作成されるrouteは、
php artisan route:list
の実行によると、
+--------+----------+-------------+------+--------------------------------------------------------------+-----------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+-------------+------+--------------------------------------------------------------+-----------------+ | | POST | admin/login | | App\Http\Controllers\Admin\Auth\AuthController@login | web,guest:admin | | | GET|HEAD | admin/login | | App\Http\Controllers\Admin\Auth\AuthController@showLoginForm | web,guest:admin | | | POST | user/login | | App\Http\Controllers\User\Auth\AuthController@login | web,guest | | | GET|HEAD | user/login | | App\Http\Controllers\User\Auth\AuthController@showLoginForm | web,guest | +--------+----------+-------------+------+--------------------------------------------------------------+-----------------+
これに他のいくつもの機能を加えていくと、管理が大変になってきます。現在私が管理しているプロジェクトでは、管理画面だけで300近いrouteが存在します。そうなると、タイプミスも増えるでしょうし、一目見て理解もしにくいです。
管理性を高める1つの方法は、prefix
を使用してroutesのgroup
を分割します。
先の例では、user
とadmin
のprefix
を用いて、それぞれのプレイヤーに1つのgroup
を作成します。
Route::group(['prefix' => 'user', 'namespace' => 'User', 'middleware' => 'web'], function () { Route::get('login', 'Auth\AuthController@showLoginForm'); Route::post('login', 'Auth\AuthController@login'); }); Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'web'], function () { Route::get('login', 'Auth\AuthController@showLoginForm'); Route::post('login', 'Auth\AuthController@login'); });
行数が少し増えたかもしれませんが、重複部分がなくなってすっきりしただけでなく、グループ分けで理解しやすいコードとなりましたね。さらに、namespace
を使用することで、コントローラのnamespaceも重複も省いています。
さて、実際生成されるrouteはどうなのでしょう?この変更で変わってしまっては問題です。
php artisan route:list
を実行すると、
+--------+----------+-------------+------+--------------------------------------------------------------+-----------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+-------------+------+--------------------------------------------------------------+-----------------+ | | POST | admin/login | | App\Http\Controllers\Admin\Auth\AuthController@login | web,guest:admin | | | GET|HEAD | admin/login | | App\Http\Controllers\Admin\Auth\AuthController@showLoginForm | web,guest:admin | | | POST | user/login | | App\Http\Controllers\User\Auth\AuthController@login | web,guest | | | GET|HEAD | user/login | | App\Http\Controllers\User\Auth\AuthController@showLoginForm | web,guest | +--------+----------+-------------+------+--------------------------------------------------------------+-----------------+
まったく先と同じです。
メルマガ購読の申し込みはこちらから。