Как добавить новый параметр для проверки в логине Laravel - PullRequest
0 голосов
/ 22 апреля 2019

В LoginController я переопределяю метод credentials, например:

protected function credentials(Request $request)
{
    $credentials = $request->only($this->username(), 'password');
    $credentials['status'] = User::STATUS_ACTIVE;

    return $credentials;
}

И эта работа довольно хорошо. Но когда я пытаюсь добавить параметр, который не является столбцом таблицы Users, я не знаю, как это проверить. Некоторым нравится это:

protected function credentials(Request $request)
{
    $credentials = $request->only($this->username(), 'password');
    $credentials['status'] = User::STATUS_ACTIVE;
    $credentials['customer-status'] = Customer::STATUS_ACTIVE;

    return $credentials;
}

Где я могу проверить правильность значения? Я попытался сделать слушатель события, чтобы попытаться войти, но это не работает. Моя идея состоит в том, чтобы сделать Eloquent запрос, чтобы вернуть учетную запись действий клиентов. Если их больше одного, статус клиента для этого пользователя true.

1 Ответ

0 голосов
/ 22 апреля 2019

Если кому-то интересно узнать, как я это решил, объяснение таково:

На основе этого кода я нашел в github: https://gist.github.com/joseluisq/fb84779ea54eaebf54a9d8367117463e

В LoginController.php Я переопределяю 2 метода (login и sendFailedLoginResponse):

public function login(Request $request)
{
    $this->validateLogin($request);

    if ($this->hasTooManyLoginAttempts($request)) {
        $this->fireLockoutEvent($request);
        return $this->sendLockoutResponse($request);
    }

    $this->incrementLoginAttempts($request);

    $user = User::where('email', $request->email)->first();

    if (!$user) {
        return $this->sendFailedLoginResponse($request);
    }

    $customers = Customer::join('users_customers', 'users_customers.customer_id', 'customers.id')
        ->where([
            ['users_customers.user_id', '=', $user->id],
            ['customers.status', '=', Customer::STATUS_ACTIVE]
        ])
        ->count();

    if ($customers === 0) {
        return $this->sendFailedLoginResponse($request, 'auth.inactive');
    }

    if ($this->attemptLogin($request)) {
        return $this->sendLoginResponse($request);
    }

    return $this->sendFailedLoginResponse($request);
}

protected function sendFailedLoginResponse(Request $request, $trans = 'auth.failed')
{
    $errors = ['email' => trans($trans)];

    if ($request->expectsJson()) {
        return response()->json($errors, 422);
    }

    return redirect()
        ->back()
        ->withErrors($errors);
}

Не забудьте определить сообщение на auth.php и установить uses.

Пс .: я не пользуюсь $credentials['customer-status'] = Customer::STATUS_ACTIVE;, как я и думал.

...