kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

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