開発しているプログラムの機能が増えてくると、必然的に定義する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を分割します。

先の例では、useradminprefixを用いて、それぞれのプレイヤーに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       |
+--------+----------+-------------+------+--------------------------------------------------------------+-----------------+

まったく先と同じです。

By khino