フレームワークの機能として最低限欲しいもののひとつに認証があります。
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
お!ログイン画面のURL/login
にリダイレクトされました。
先ほどのmiddlewareメソッドによるリダイレクトでしょうか。
login
まだユーザーを登録していないので、次のURI・・・であるloginは上記のとおりです。
password/email
リセットURLをメールでお知らせするものと予想。
これもユーザー登録してみたら何か試せると思います。
しかし、POST
なので、次に登場するpassword/reset
でリセットボタンを押下したら呼び出されるのかもしれません。
password/reset
メールアドレスを入力する欄があります。
該当メールアドレスを持つユーザーがいたら、ランダムに付与したパスワードをお知らせするメールが届くものと思われます。
password/reset/{token}
というものもあるようですが、password/email
にて送信されたメールのリンクをクリックしてたどり着く、パスワードリセットページなのでしょう。
register
さて。
Laravelにデフォルトでついている認証の機能面を見ても今のところはしょうがなくて、繰り返しになりますが、仕組みです。
次は自分でルーティングを定義して画面を表示する予定です。
■□■ Laravel入門 □■□
Laravel 5.4 (1)事始め
Laravel 5.4 (2)インストール
Laravel 5.4 (3)ルーティング基礎(認証)
Laravel 5.4 (4) ルーティングとビューのちょっとだけ入口