いがにんのぼやき

若手WEBエンジニアのブログ。IT、WEB、バンド、アニメ。

Laravelのユーザー関係のルート定義がどこにあるか

Laravelにはユーザーを作成、認証する機能がある。
Laravel 5.4ではphp artisan make:authコマンドを打つと特定のコントローラーとビューに加えて、routes/web.phpAuth::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));
}

このコアの実装は後々追って行きたい。