Laravel 5.4 (3)ルーティング基礎(認証)

フレームワークの機能として最低限欲しいもののひとつに認証があります。
Laravel5.4ではデフォルトの認証機能があるので、設定してみるとともに、どのようにルーティングを定義するのかにも迫りたい。

認証

以下のURLを参考に設定を行いました。
http://qiita.com/zaburo/items/9fcf0f4c771e011a4d35

php artisan make:authを実行するとSyntax error or access violation: 1071 Specified key was too longというエラーが出るので、以下参照
https://laravel-news.com/laravel-5-4-key-too-long-error

再度懲りずに実行すると、Class 'App\Providers\Schema' not foundというエラーが出るので、続いて以下参照
https://laracasts.com/discuss/channels/laravel/php-artisan-migrate-errorclass-appprovidersschema-not-found?page=1

認証のルーティング

この結果定義されたルーティングは以下のとおり。
$php artisan route:list

+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method   | URI                    | Name             | Action                                                                 | Middleware   |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
|        | GET|HEAD | /                      |                  | Closure                                                                | web          |
|        | GET|HEAD | api/user               |                  | Closure                                                                | api,auth:api |
|        | GET|HEAD | 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    |
+--------+----------+------------------------+------------------+------------------------------------------------------------------------+--------------+

URIの列に記述されているものが、ルーティングされているものなのでしょう。
一番上はLarabelをインストールした時からあるURIなので、2番目以降のGETを次々に試していきたい。
しかし、2番目のapi/userがいきなり意味不明。
Actionという列の関数が実行されるのだろうけれど、/ともども、Closureとあって、他のものようにクラス名らしきものが記述されていない。
どこに定義されているクロージャーが実行されるのか。
多分、ルーティングの定義と同時にクロージャーが定義されているものと見当をつけてみたけど、このルーティングはどこに定義されているのかが、この表では分からない。

いちいちこんなものにこだわらなくてもいい気もするけれど、現時点で知りたいのは使い方だけではなく、どちらかというと仕組みを知っておきたいので、分からないことは全て調べておきたい。

ルーティングが定義されているファイル類は、laravel/routes/以下にあるようです。
(注:Laravel 5.3より古いバージョンではapp/Http/routes.phpに定義されていたようです。)

  • api.php
  • channels.php
  • console.php
  • web.php

お!いきなりapi.phpというファイルが怪しいではないですか。
この中に

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

と定義されていて、ビンゴのようです。
middlewareという記述がありますが、リファレンスによれば、

ミドルウェアはアプリケーションへ送信されたHTTPリクエストをフィルタリングする、便利なメカニズムを提供します。たとえば、アプリケーションのユーザが認証されているかを確認するミドルウェアがLaravelに用意されています。ユーザが認証されていなければ、このミドルウェアはユーザをログインページへリダイレクトします。反対にそのユーザが認証済みであれば、そのリクエストがアプリケーションのその先へ進むことを許可します。

ということらしく、今回は正に認証なのでぴったりの機能ですね。
middlewareメソッドの引数がどのミドルウェアを使うかを指定していてるみたいですけれど、表記上、staticで呼び出されているmiddlewareメソッドは、staticに定義されていないんですね・・・

    /**
     * Get or set the middlewares attached to the route.
     *
     * @param  array|string|null $middleware
     * @return $this|array
     */
    public function middleware($middleware = null)

その上、スタティックに呼び出しておいて$thisを返す無双っぷりです。

この仕組みはちょっとややこしくて、以下のURLの説明に任せます。
http://www.1×1.jp/blog/2014/03/laravel-facade-class.html
middlewareの後に呼び出しているgetメソッドも、Route::getも同じ感じのファサードクラスの解決などが行われたり、__callStatic()メソッドが使われたりすることで、スタティックにスタティックでないメソッドが呼び出されたり、他のクラスに定義されているメソッドが呼び出されたりしているということで、今のところはその事実だけ抑えておくことにします。

getメソッド第一引数の/usrはURIの後半のようですが、URI前半のapiはどこで決まっているのか。
apiミドルウェアグループというものだからなのか。
フィルタしないときのルーティングはどうするのか、という疑問も現時点では残されていますが、apiとプレフィックスがついていることか、これはREST API用か何かだと思われ、api/userへの追及も一旦ここまでにします。

認証関連画面

api.php以外のURIを試してみましょう。
api/user以外のルーティングは以下のファイルに定義されています。
laravel/framework/src/Illuminate/Routing/Router.php
ここです。

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');
    }

フレームワークの中のファイルなので、どうやってこれが呼び出されているのかはもういいことにします。
しかし、ルーティングはどこかに纏まらないものでしょうか。
この認証はビルトインな機能なので、これは例外的なものなのでしょうか。

自分で定義するものは、routes/web.phpに定義していく模様です。
https://readouble.com/laravel/5.4/ja/routing.html

home

気を取り直してまずは/homeからアクセスしてみます。
laravel-home-screen

お!ログイン画面のURL/loginにリダイレクトされました。
先ほどのmiddlewareメソッドによるリダイレクトでしょうか。

login

まだユーザーを登録していないので、次のURI・・・であるloginは上記のとおりです。

password/email

リセットURLをメールでお知らせするものと予想。
これもユーザー登録してみたら何か試せると思います。
しかし、POSTなので、次に登場するpassword/resetでリセットボタンを押下したら呼び出されるのかもしれません。

password/reset

laravel-password-reset-screen
メールアドレスを入力する欄があります。
該当メールアドレスを持つユーザーがいたら、ランダムに付与したパスワードをお知らせするメールが届くものと思われます。
password/reset/{token}というものもあるようですが、password/emailにて送信されたメールのリンクをクリックしてたどり着く、パスワードリセットページなのでしょう。

register

laravel-register-screen
もうお分かりかと思いますが、登録画面が開きました。

さて。
Laravelにデフォルトでついている認証の機能面を見ても今のところはしょうがなくて、繰り返しになりますが、仕組みです。

次は自分でルーティングを定義して画面を表示する予定です。

■□■ Laravel入門 □■□
Laravel 5.4 (1)事始め
Laravel 5.4 (2)インストール
Laravel 5.4 (3)ルーティング基礎(認証)
Laravel 5.4 (4) ルーティングとビューのちょっとだけ入口