アプリケーションを試しに作っているのだが、過去の「結局Laravelに戻って、ぼちぼち始める」で認証の仕組みが簡単に組み込めるよ、てなことを書いて、確かに認証ができていた。しかし、この認証は、未ログイン時に自分を登録するとアカウントが自動的に作成される、ということを想定したものだった。
そこで、ログインした際にのみ登録画面を表示させようと、app/Http/route.phpに以下のように書いてみたのだった。
1 2 3 |
Route::auth(); Route::get('/register',['middleware' => 'auth','uses' => 'Auth\AuthController@showRegistrationForm']); Route::post('/register',['middleware' => 'auth','uses' => 'Auth\AuthController@register']); |
すると、確かにログインする前に「/register」で登録画面を出そうとすると、ログイン画面にリダイレクトされる。よしよし。と思っていたが、書き足した「’middleware’ => ‘auth’」というのの意味がわからず、「これを書けば認証が必要になるんだな」の程度しか思ってなかった。
さてさて、ユーザー登録に認証が必要になったので良かった。と思って、今度は認証後に登録させようと、ログイン後のプルダウンメニューに登録を追加するため、resources/views/layouts/app.blade.phpに以下のように書き換えた。
1 2 3 4 |
<ul class="dropdown-menu" role="menu"> <li><a href="{{ url('/logout') }}"><i class="fa fa-btn fa-sign-out"></i>Logout</a></li> <li><a href="{{ url('/register') }}">Register</a></li> </ul> |
そしていざ、ログイン後に登録画面を表示しようとすると、あれ、トップ画面にリダイレクトされちゃう。あれれ、と思って探していたら、これがミドルウェアという仕組みでそうなっているのであった。ミドルウェアとはコントローラーにアクセスする前や後に必ず実施するフィルタみたいなものらしい。
app/Http/Middlewareを見たところ、「RedirectIfAuthenticated.php」というそのもののリストがあり、リダイレクトしているのはここであることがわかった。じゃあどこでこれを呼び出すように定義されているのか、というと、app/Kernel.phpのrouteMiddlewareというマップで定義しているらしい。同じファイルにmiddlewareというのもがあるが、これは必ず実施するミドルウェアで、middlewareGroupsはミドルウェアをグループ分けできるものらしい。routeMiddlewareで定義されたキーと値のペアは、値はミドルウェアの実装クラスで、キーをどう使うか、というところで、route.phpのさっきの
1 |
Route::get('/register',['middleware' => 'auth','uses' => 'Auth\AuthController@showRegistrationForm']); |
の「’middleware’ => ‘auth’」の’auth’だったのだ。なーるほど。
で、登録時に「RedirectIfAuthenticated」ミドルウェアを通るときにリダイレクトされてしまっていたので、これは’guest’というキーにしたがって動いていることがわかった。んで、今度はコントローラー「app\Http\Controllers\Auth\AuthController.php」を見てみたところ、コンストラクタにそれらしきものがあった。
1 2 3 4 |
public function __construct() { $this->middleware($this->guestMiddleware(), ['except' => 'logout']); } |
‘except’って「除く」ってことらしいから、logoutはログイン中の’guest’ミドルウェアからは除きますよ、って定義をしてあるようだ。だからログイン中にログアウトできるということだから、ここを
1 2 3 4 |
public function __construct() { $this->middleware($this->guestMiddleware(), ['except' => ['logout','register','showRegistrationForm']]); } |
ってやってみたら(ここはメソッド名を書くようです)、想定通りログイン画面でユーザー登録フォームが出てきた!やった!
で、このミドルウェアって、artisanコマンドで
1 |
> php artisan route:list |
で、「Middleware」でどのミドルウェアを経由するかを見られるようで、routeMiddlewareに定義されたマップのキーがここに書かれている。「auth」が未認証時に認証画面に飛ばされるミドルウェア、「guest」が認証時にルート画面に飛ばされるミドルウェアであるようで、
1 2 3 4 5 |
+--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+ | | GET|HEAD | register | | App\Http\Controllers\Auth\AuthController@showRegistrationForm | web,auth | | | POST | register | | App\Http\Controllers\Auth\AuthController@register | web,auth | |
のようになっていればOKだと思う。