Laravelのユーザー関係のルート定義がどこにあるか
Laravelにはユーザーを作成、認証する機能がある。
Laravel 5.4ではphp artisan make:auth
コマンドを打つと特定のコントローラーとビューに加えて、routes/web.phpにAuth::routes();
という記述が追加される。
このroutesメソッドでユーザー関係のルーティングが定義されるようだが、どこにあるかよく分からなかったので調べて見た。
まずはルート定義を確認
$ php artisan route:list +--------+-----------+------------------------------+----------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------------+----------------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth | | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest | | | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest | | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest |
こんな感じでユーザーに関するルーティングが追加されている。
Auth::routes()
Illuminate\Support\Facade\Auth
クラスにその定義が存在する。
<?php /** * Register the typical authentication routes for an application. * * @return void */ public static function routes() { static::$app->make('router')->auth(); }
$appはIlluminate\Foundation\Application
クラスである。
$app->make('router')はIlluminate\Routin\Router
クラスを返し、そのRouterクラスのauthメソッドに、今回のユーザー関係の定義が書かれている。
<?php /** * Register the typical authentication routes for an application. * * @return void */ public function auth() { // Authentication Routes... $this->get('login', 'Auth\LoginController@showLoginForm')->name('login'); $this->post('login', 'Auth\LoginController@login'); $this->post('logout', 'Auth\LoginController@logout')->name('logout'); // Registration Routes... $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register', 'Auth\RegisterController@register'); // Password Reset Routes... $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset'); $this->post('password/reset', 'Auth\ResetPasswordController@reset'); }
これがAuth::routes()
の正体である。
余談
ちなみにIlluminate\Routing\RoutingServiceProvider
に今回の$app->make('router')で生成されるインスタンスの定義はIlluminate\Routing\RoutingServiceProvider
に存在している。
DIコンテナの定義だ。
<?php /** * Register the router instance. * * @return void */ protected function registerRouter() { $this->app->singleton('router', function ($app) { return new Router($app['events'], $app); }); }
元々のサービスプロバイダーの登録もconfig/app.php
に定義してあるわけではなく、先ほどのApplicationクラスで行なっているようだ。
<?php /** * Register all of the base service providers. * * @return void */ protected function registerBaseServiceProviders() { $this->register(new EventServiceProvider($this)); $this->register(new LogServiceProvider($this)); $this->register(new RoutingServiceProvider($this)); }
このコアの実装は後々追って行きたい。