Laravel 5-错误调用未定义的方法Illuminate \ Events \ Dispatcher :: fire()

时间:2019-03-04 08:40:45

标签: php rest laravel-5

我正在使用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');
    });
});

8 个答案:

答案 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);
}