PHP・Laravelの勉強中 ログイン機能のController・つづき
6:04
①4日前からのつづき『しかし、Laravel8のログイン機能のController達のプログラム内容が、さっぱりわからない。』をやっている。
①-1. 『web.phpのAuth::routes();について分かったこと。』のつづき
・なぜ、「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Support\Facades\Route.php」にgetメソッドが無いのに
Laravel\Ui\AuthRouteMethods.phpでは「$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');」とか、getが使えているのか?
を、調べた。
・Route.phpにあった getFacadeAccessor()の「return 'router';」は、Laravelはサービスコンテナから
「router」に結び付けられたインスタンスを依存解決しているってことで、
サービスコンテナの「router」は「Illuminate\Routing\Router」のことだった。
確かに、Router.phpにはgetメソッドがある。
public function get($uri, $action = null) { return $this->addRoute(['GET', 'HEAD'], $uri, $action); }
・サービスコンテナ結合キー=routerで、ファサード=Route、
クラス=Illuminate\Routing\RouterなんだってNetに書いてあった。
’router’が、どこに書いてあるかを調べたら、
「C:\laravel-project\sample-project\vendor\laravel\framework\src\Illuminate\Foundation\Application.php」にあった。これだろうと思う。
これによると、'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
なので、関係しているのは [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],の3個らしい。
\Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::classは両方interfaceだった。
/** * Register the core class aliases in the container. * * @return void */ public function registerCoreContainerAliases() { foreach ([ 'app' => [self::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class], 'auth' => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class], ・・・ 'request' => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class], 'router' => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class], ・・・ 'view' => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class], ] as $key => $aliases) { foreach ($aliases as $alias) { $this->alias($key, $alias); } } }
②ログインはphp artisan route:listによると、「 GET|HEAD login ................. login › Auth\LoginController@showLoginForm」なので
C:\laravel-project\sample-project\app\Http\Controllers\Auth\LoginController.phpになる。
コンストラクトに$this->middleware('guest')->except('logout');とある。
middleware('guest')はApp\Http\Kernel.phpに記述されている$routeMiddlewareの
'guest'に登録されているRedirectIfAuthenticatedクラスのこと
・App\Http\Kernel.php protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, ・・・ 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
③C:\laravel-project\sample-project\app\Http\Middleware\RedirectIfAuthenticated.php
handleメソッドが動くらしい。
ここでは、Illuminate\Auth\AuthManagerでguard()メソッドを実行するとSessionGuardインスタンスが作成される。
Auth::guard($guard)->check()はSessionGuardのcheckメソッドを実行している。
認証が完了している場合は/home(RouteServiceProvider::HOME)にリダイレクトする。
・$guardsってなんだろう?
・ガード (guard)とは、C:\laravel-project\sample-project\config\auth.phpにある、'guards'。
Laravel では「認証」と呼ぶ。ECサイトの「管理者」と「会員」など。
・ここにある$guardsって、だれが渡してくれるんだろう?
・なぜ、 foreachで回しているのだろう?
ガード (guard)が複数あるかららしい。
・return $next($request);でなぜログイン画面になるのか?
・次のmiddlewareの処理につながる$nextへ$requestが渡される。
・$next($request)はコントローラーのアクションが実行された結果が返されます。
・LoginController@showLoginFormのshowLoginFormはどこにあるのだろう?
・LoginController中に「 use AuthenticatesUsers;」とありtraitだった。
「C:\laravel-project\sample-project\vendor\laravel\ui\auth-backend\AuthenticatesUsers.php」は
showLoginFormメソッドを持っていて「return view('auth.login');」している。
・RedirectIfAuthenticated.php public function handle(Request $request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { return redirect(RouteServiceProvider::HOME); } } return $next($request); } ||< ④LoginController中のAuthenticatesUsers.phpは「ublic function login(Request $request)」でログインメソッドでログインしている ・ $this->validateLogin($request);でバリデーションしている。 ・以前サンプルで「class CreateTask extends FormRequest」作ったとき、バリデーションは 「 public function rules()」に「return [ 'title' => 'required|max:100', 'due_date' => 'required|date|after_or_equal:today', ];」と書いていたのだけど、Controller中にも書ける・・・のかな。 ・validateLoginメソッド使用した後エラーがあるかどうか聞いていないので、エラーの時は勝手にエラーに戻るのかな? >|| protected function validateLogin(Request $request) { $request->validate([ $this->username() => 'required|string', 'password' => 'required|string', ]); }