Laravel 5 - 更改默认登录操作
Posted
技术标签:
【中文标题】Laravel 5 - 更改默认登录操作【英文标题】:Laravel 5 - change default login action 【发布时间】:2015-11-09 05:18:19 【问题描述】:我正在使用 Laravel 5.0 内置的身份验证控制器。但是,除了身份验证之外,我还想在登录期间添加一些操作,例如更新另一个表。不过,我似乎找不到应该在哪里编写这样的代码。
为了注册,我在“Services”文件夹下的“Registrar.php”文件中添加了我想要的内容。我怎样才能为登录做到这一点?
提前致谢。
【问题讨论】:
【参考方案1】:您可以将以下函数放入 AuthController.php
以覆盖 AuthenticatesAndRegistersUsers
特征的默认函数。您可以根据需要更改它。
/**
* Handle a login request to the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function postLogin(Request $request)
$this->validate($request, [
'email' => 'required|email', 'password' => 'required',
]);
$credentials = $request->only('email', 'password');
if ($this->auth->attempt($credentials, $request->has('remember')))
return redirect()->intended($this->redirectPath());
return redirect($this->loginPath())
->withInput($request->only('email', 'remember'))
->withErrors([
'email' => $this->getFailedLoginMessage(),
]);
【讨论】:
从特征复制代码不是最好的选择。特征中的身份验证逻辑可能会在未来的版本中发生变化,并且不会反映在您的代码中。当用户通过身份验证时,Laravel 会触发事件,这些事件应该用于将身份验证逻辑与需要运行的其他操作分开。 在答案中查看身份验证事件的示例用法 @jedrzej.kurylo 同意。我完全忘记了事件。事件是挂钩代码的更好地方。投票赞成。 @pinkalvansia 感谢您抽出宝贵时间回答。【参考方案2】:Laravel 的身份验证层会在发生不同的身份验证相关操作时触发多个事件:
auth.attempt - 当用户尝试进行身份验证时 auth.login - 当用户认证成功时 auth.logout - 用户注销时您可以侦听这些事件(在您的情况下为 auth.login)并应用必要的操作,而无需从特征复制代码,如果发生一些更改,您可以手动更新代码身份验证有效。
首先,你需要创建一个监听类:
class AuthLoginHandler
public function handle(User $user, $remember)
// do whatever you need to do after user authenticates
然后在你的 EventServiceProvider 类中注册监听器:
protected $listen = [
'auth.login' => [
AuthLoginHandler::class
],
];
现在,每次用户进行身份验证时都会调用处理程序的 handle() 方法,即使您有多个针对不同用户类型的登录表单,甚至是表单以外的其他一些身份验证形式。
你可以在这里阅读更多关于 Laravel 事件的信息:http://laravel.com/docs/5.1/events#defining-listeners
【讨论】:
感谢您抽出宝贵时间回答。我应该把那个监听器类放在哪里?任何特定的 laravel 文件夹? 任何你喜欢的地方,只要命名空间匹配目录结构,以便它可以自动加载。在文档中,他们将侦听器放在 app/Listeners 中,因此您也可以这样做 任何想法为什么AuthLoginHandler@handle
方法在登录时没有被触发?我按照答案中的描述做了所有事情,但是登录后方法没有执行。我希望我在这里遗漏了一些基本的东西。 (Laravel 5.2)以上是关于Laravel 5 - 更改默认登录操作的主要内容,如果未能解决你的问题,请参考以下文章