

Laravel5.5においてid、メールアドレス両方でログインできるように  
ログインフォームのカスタマイズを行っていて、ログイン時にバリデーションをかけるため `app\Http\Requests\UserRequest` を作り、
`app/Http/Controllers/Auth/LoginController.php` でuseしています。

LoginControllerでは
`vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php`
のattemptLoginをオーバーライドしてUserRequestを渡しているのですが下記のようなエラーが出てうまくいきません。

> Type error: Argument 1 passed to
> App\Http\Controllers\Auth\LoginController::attemptLogin() must be an
> instance of app\Http\Requests\UserRequest, instance of
> Illuminate\Http\Request given, called in
> /vagrant/exapmle.com/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
> on line 42

LoginControllerは下記のようにしております。

[code]

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Illuminate\Http\Request;
    use app\Http\Requests\UserRequest;
    
    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 = '/home';
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('guest')->except('logout');
        }
    
        public function username()
        {
            return 'login';
        }
    
        protected function attemptLogin(UserRequest $request)
        {
    
    dd($request);
    //省略
        }
    }
    
    
[/code]

UserRequestは

[code]

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    use Illuminate\Contracts\Validation\Validator;
    use Illuminate\Http\Exceptions\HttpResponseException;
    use Illuminate\Http\Request;
    
    class UserRequest extends FormRequest
    {
        public function authorize()
        {
            return true;
        }
    
        public function rules(Request $request)
        {
            if (filter_var($request->login, \FILTER_VALIDATE_EMAIL)) {
                return [
                    'login' => 'required|max:30',
                    'password' => 'required|between:6,20',
                ];
            } else {
                return [
                    'login' => 'required|between:6,20',
                    'password' => 'required|between:6,20',
                ];
            }
    
        }
    
    
        public function messages()
        {
            return [
                // 省略
            ];
        }
    
    
        protected function failedValidation( Validator $validator)
        {
            $response['data']    = [];
            $response['status']  = 'NG';
            $response['summary'] = 'Failed validation.';
            $response['errors']  = $validator->errors()->toArray();
    
            throw new HttpResponseException(
                response()->json( $response, 422 )
            );
        }
    
    }
    
[/code]

検索してみたのですが同じようなケースが見つかりませんでした。  
マルチログインでadminも作ったのですがAdminLoginController内でAdminRequestをuseした場合はうまく動作しました。デフォルトで用意されているLoginControllerの場合はうまくいかないのでしょうか？  
ご教授頂けませんでしょうか。  
よろしくお願い致します。


CC BY-SA 4.0
2019-01-15T03:02:09.417
51979
2019-12-12T11:05:44.983
2019-12-12T11:05:44.983
32986
30596
question
laravel-5
Laravel5.5のLoginController内でオーバーライドしたattemptLoginにフォームリクエストのインスタンスが渡せない


自己解決しました。

[code]

    public function login(UserRequest $request)
    {
        $username = $request->input($this->username());
        $password = $request->input('password');
        if (filter_var($username, \FILTER_VALIDATE_EMAIL)) {
            $credentials = ['email' => $username, 'password' => $password];
        } else { 
            $credentials = [$this->username() => $username, 'password' => $password];
        }
        if ( Auth::guard()->attempt($credentials , $request->remember)) {
            return $credentials;
        }
        // 省略
    }
    
[/code]

attemptLoginメソッドは利用しないでloginメソッドをオーバーライドすることでうまくいきました。


CC BY-SA 4.0
2019-01-16T16:39:22.043
52037
2019-01-16T16:39:22.043
30596
51979
answer