我正在使用JWT开发REST API。
登录路由很好,但是middleware jwt.auth
组中的路由器不起作用。
错误:
Symfony \ Component \ Debug \ Exception \ FatalThrowableError:调用未定义的方法Illuminate \ Events \ Dispatcher :: fire()
我的代码:
Route::group(['namespace' => 'Api'], function(){
Route::get('user/login', 'AuthController@login');
Route::group(['middleware' => ['jwt.auth']], function() {
Route::get('auth/me', 'AuthController@me');
});
});
答案 0 :(得分:1)
Laravel v5.8中不推荐使用Event
方法fire
,但是它在Laravel v5.7的早期版本中有效
您可以在Laravel v5.8和更高版本中使用方法dispatch
。它的工作方式与fire
方法相同,并将事件分派到EventServiceProvider
答案 1 :(得分:0)
fire
在laravel 5.8 中更改为dispatch
,此处https://github.com/laravel/framework/pull/26392
答案 2 :(得分:0)
如果您使用tymondesigns/jwt-auth
软件包,则此问题对您有帮助:https://github.com/tymondesigns/jwt-auth/issues/1787
此版本解决了此问题:https://github.com/tymondesigns/jwt-auth/releases/tag/1.0.0-rc.4
答案 3 :(得分:0)
JWT仍使用fire方法,并在中使用了dispatch方法 Laravel 5.8,因此解决方案应更改JWT中的方法调用。
此解决方案在Laravel 5.8上与我合作
转到项目中的此路径
\vendor\tymon\jwt-auth\src\Middleware\GetUserFromToken.php
这是原始代码:
public function handle($request, \Closure $next)
{
if (! $token = $this->auth->setRequest($request)->getToken()) {
return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
}
try {
$user = $this->auth->authenticate($token);
} catch (TokenExpiredException $e) {
return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
} catch (JWTException $e) {
return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
}
if (! $user) {
return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
}
$this->events->fire('tymon.jwt.valid', $user);
return $next($request);
}
,您应该更改:
$this->events->fire('tymon.jwt.valid', $user)
收件人:
$this->events->dispatch('tymon.jwt.valid', $user);
您只能将fire
方法替换为dispatch
,因为fire
方法在Laravel 5.8中不可用,而最新的方法是使用dispatch
方法。
我希望这个解决方案能与您一起工作。
答案 4 :(得分:0)
将Laravel 5.8+的fire()更改为dispatch()
答案 5 :(得分:0)
将laravel更新至5.8时,请注意以下几点:
射击方法的影响可能性:低
射击方法(在Laravel 5.4中已弃用) Illuminate \ Events \ Dispatcher 类已被删除。您应该使用 而是使用dispatch 方法。
查看更多:https://laravel.com/docs/5.8/upgrade#events
对于旧的jwt,他们使用fire方法,因此您的代码是错误的。按照并修复它:
将Jwt更新到新版本-> 1.0.0-rc.4
在您的composer.json文件中添加“ tymon / jwt-auth”:“ ^ 1.0.0-rc.4 ”并运行 “ 撰写者更新”
Ex: "require": {
"php": "^7.1.3",
"laravel/framework": "5.8.*",
"laravel/tinker": "^1.0",
"predis/predis": "^1.1",
"tymon/jwt-auth": "^1.0.0-rc.4"
},
查看更多:https://jwt-auth.readthedocs.io/en/develop/laravel-installation/
->在模型用户中,添加新代码:
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
->在 config / jwt.php 中,将提供者更改为
'jwt' => 'Tymon\JWTAuth\Providers\JWT\Namshi',
'auth' => 'Tymon\JWTAuth\Providers\Auth\Illuminate',
'storage' => 'Tymon\JWTAuth\Providers\Storage\Illuminate',
->在 config / auth.php 中将 guards 更改为
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
希望它能对您有所帮助。
答案 6 :(得分:0)
版本5.8上的Laravel护照解决方案
我正在使用Laravel Passport
并遇到相同的问题,就我的情况而言,在vendor/laravel/passsport/src/Bridge/RefreshTokenRepository.php
文件中,第71行将$this->events->fire(...)
方法名称更改为$this->events->dispatch(...)
,此技巧得以解决问题,我可以得到令牌。
答案 7 :(得分:-2)
好吧,我解决了这个错误。他们的2小时.....:/
我修改了laravel的Dispatcher.php文件。
1)首先在文件中 vendor \ laravel \ framework \ src \ Illuminate \ Events \ Dispatcher.php
1.1)添加此代码。
/**
* Fire an event and call the listeners.
*
* @param string|object $event
* @param mixed $payload
* @param bool $halt
* @return array|null
*/
public function fire($event, $payload = [], $halt = false);
2)在第二个文件中。 vendor \ laravel \ framework \ src \ Illuminate \ Contracts \ Events \ Dispatcher.php
2.1)添加此代码。
/**
* Fire an event and call the listeners.
*
* @param string|object $event
* @param mixed $payload
* @param bool $halt
* @return array|null
*/
public function fire($event, $payload = [], $halt = false)
{
return $this->dispatch($event, $payload, $halt);
}