Laravel 自动生成验证的实例讲解:login / logout(2)
而其中最重要的就是看这个表单被提交到了哪里,结合上面的路由表,可以看到是
public function login(Request $request) { $this->validateLogin($request); /** * protected function validateLogin(Request $request) { $this->validate($request, [ $this->username() => 'required|string', 'password' => 'required|string', ]); } 其中 $this->username() 就是 return 'email'; **/ // 限制请求次数,防止暴力破解的 if ($this->hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); return $this->sendLockoutResponse($request); } /** // 关于 attempt 的介绍可以看我上一篇博客 protected function attemptLogin(Request $request) { return $this->guard()->attempt( $this->credentials($request), $request->has('remember') ); } **/ // 如果验证通过的话 if ($this->attemptLogin($request)) { return $this->sendLoginResponse($request); } // 否则的话增加验证的统计次数 $this->incrementLoginAttempts($request); // 返回错误信息 return $this->sendFailedLoginResponse($request); }
可以看到验证的重点还是Auth::attempt()函数,而且默认是使用email进行验证。
退出操作的代码如下:
public function logout(Request $request) { $this->guard()->logout(); $request->session()->invalidate(); return redirect('/'); }
$this->guard()的代码如下:
protected function guard() { return Auth::guard(); }
logout的具体的执行代码如下,别问我怎么找到的,PHPStorm的全项目文本搜索不解释:\Illuminate\Auth\SessionGuard.php:
public function logout() { $user = $this->user(); $this->clearUserDataFromStorage(); if (! is_null($this->user)) { $this->cycleRememberToken($user); } if (isset($this->events)) { $this->events->dispatch(new Events\Logout($user)); } // Once we have fired the logout event we will clear the users out of memory // so they are no longer available as the user is no longer considered as // being signed into this application and should not be available here. $this->user = null; $this->loggedOut = true; }
其中牵扯很多,那么我换种角度考虑,假设我们不考虑logout()的具体实现,而是思考如何制作自己的退出设置,那么该如何修改源码呢?好像直接修改成下面的形式就可以了:
public function logout(Request $request) { Auth::guard()->logout(); $request->session()->invalidate(); // 自定义重定向地址 return redirect('/'); }
其中的很多内容都跟我们的设置无关,全自动的调用,所以我们的退出按钮就只需要运行上述代码即可。本人请测有效。