使用Attempt方法使用用户名或电子邮件进行Laravel 5自定义登录

时间:2017-11-30 13:00:09

标签: php laravel authentication

在我的laravel应用程序中,一开始我决定创建自己的自定义登录控制器,而不是使用基本控制器。

public function postSignin(Request $request, AppMailer $mailer) {
    $this->validate($request, [
        'email' => 'required',
        'password' => 'required',
    ]);     

    if (!Auth::attempt($request->only(['email', 'password']), $request->has('remember'))) {
        return redirect()->back()->with('info', 'Could not sign you in with those details.');
    }

    if (Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password'), 'verified' => 0]))
    {
        $mailer->sendEmailConfirmationTo(Auth::user());
        Auth::logout();
        return redirect()->back()->with('info', 'Email verification required.');
    }

    Auth::user()->last_login = new DateTime();
    Auth::user()->save();       

    return redirect()->back()->with('info', 'You are now signed in.');
}   

现在我想编辑它,以便用户也可以使用相同的字段使用他们的用户名而不仅仅是他们的电子邮件登录。但是,尝试方法令人困惑。即使在我改变价值观之后,它似乎也期待一封电子邮件。

在这种情况下,Auth文档也没有用。它要求我添加:

public function username()
{
    return 'username';
}

在登录控制器中,但显然这是默认设置。

1 个答案:

答案 0 :(得分:0)

您可以使用' FILTER_VALIDATE_EMAIL '检查器。

$username = $request->get('username');
$password = $request->get('password');
$remember_me = $request->get('remember_me','1');

$field = filter_var($username,FILTER_VALIDATE_EMAIL)? 'email': 'username';

if(Auth::attempt([$field => $username,'password' => $password],$remember_me)){
    //Auth successful here
}

含义 FILTER_VALIDATE_EMAIL 请检查字符串是否为电子邮件格式。

我希望这个示例代码可以帮助您。

-Ken