概要
LoginController
は、Laravelのプロジェクト開始時にapp/Http/Controllers/Auth
ディレクトリー下に生成される。
ルーティングファイルにAuth:routes()
を記述することで、このコントローラーの各アクションは以下のようにURLと結び付けられる。
method | URL | action | name |
GET | /login | showLoginForm | login |
POST | /login | login |
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */ use AuthenticatesUsers; /** * Where to redirect users after login. * * @var string */ protected $redirectTo = RouteServiceProvider::HOME; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest')->except('logout'); } } |
内容
コントローラーの機能
ソースコード冒頭のコメントの要旨は以下の通り。
- このコントローラーは、アプリケーションにおけるユーザー認証とホームページへの遷移を行う
- コントローラーはトレイト(
AuthrsenticatesUsers
)を用いてこの機能を導入している。
AuthenticatesUsersトレイトの導入
AuthenticatesUsers
はLaravelで準備されたトレイトで、showLoginForm
アクション、login
アクションを実装している。
1 |
use AuthenticatesUsers; |
登録後の遷移先
ログイン後の遷移先を設定している。ログイン後の遷移先を変更するには、ここでリダイレクト先を変更するか、HOME
定数を変更する。
1 |
protected $redirectTo = RouteServiceProvider::HOME; |
RouteServiceProvider
はコントローラーの冒頭でuse
されている。
1 |
use App\Providers\RouteServiceProvider; |
RouteServiceProvider
を見ると、public
定数HOME
は'/home'
に設定されている。
1 |
public const HOME = '/home'; |
ミドルウェアの適用
コントローラーのコンストラクターでミドルウェアを適用している。
1 2 3 4 |
public function __construct() { $this->middleware('guest')->except('logout'); } |
'guest'
はKernel.php
でルートミドルウェアの名前として定義されていて、RedirectIfAuthenticated
ミドルウェアを指している。
1 2 3 4 5 6 7 8 9 10 11 12 |
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ]; |
RedirectIfAuthenticated
ミドルウェアはコントローラー実行前にAuth::guard()
メソッドを呼び出している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App\Http\Middleware; use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Support\Facades\Auth; class RedirectIfAuthenticated { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string|null $guard * @return mixed */ public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } return $next($request); } } |