Laravel Passport Auth::login/Auth::logout does not exist

最近升级laravel到最新版本6.9.0
之前写的接口登录可以登录上,结果注销的时候突然报错了,刚开始以为是升级框架配置错误的原因影响的小问题。等有时间来解决这个问题的时候这个问题却困扰了我很长时间。

部分代码如下:
config/auth.php
`
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],],
`
AuthService.php
`
public function logout(Request $request)
{
Auth::logout();
$request->user()->token()->revoke();
}
`
结果一直得到如下错误(5.5版本是可以注销的)
Method Illuminate\Auth\RequestGuard::logout does not exist.

Auth使用门面模式指向AuthManager,auth的注视中也看到了
@method static void logout()
的注释,通过阅读文档和代码发现登录的时候走的是默认的guard 也就是web,然后logout时候因为加了auth:api走的是api的guard。而guards的对应关系如下:

session=>IlluminateAuthSessionGuard
token=>IlluminateAuthTokenGuard
passport=>IlluminateAuthRequestGuard

而login logout方法只有SessionGuard也就是web的guard才会有。
个人理解laravel是想只有web的session方式有登录和注销,而token和passport都是api通过token认证的方式,只校验token,所以没有login和logout。
所以如果使用了auth:api的路由如果还想使用web session的login和logout可以这样用:
Auth::guard('web')->login($user);
Auth::guard('web')->logout();
但是这样做的意义就不大了,因为通过校验后的token直接使用Auth::user()或者$request->user()是使用默认的api的guard是可以直接获取登录用户的。

你可能感兴趣的:(laravel)