【问题标题】:Laravel 5 - Error Call to undefined method Illuminate\Events\Dispatcher::fire()Laravel 5 - 错误调用未定义的方法 Illuminate\Events\Dispatcher::fire()
【发布时间】:2019-03-04 08:40:44
【问题描述】:

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

【问题讨论】:

    标签: php rest laravel-5


    【解决方案1】:

    fire 在 laravel 5.8 中更改为 dispatch https://github.com/laravel/framework/pull/26392

    【讨论】:

      【解决方案2】:

      如果你使用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】:

        Event 方法 fire 在 Laravel v5.8 中已弃用,但它适用于 Laravel v5.7 的早期版本 你可以在 Laravel v5.8 及更高版本中使用 dispatch 方法。它与fire 方法相同,并将事件分派到EventServiceProvider 中注册的事件处理函数

        【讨论】:

          【解决方案4】:

          将 Laravel 5.8+ 的 fire() 更改为 dispatch()

          【讨论】:

            【解决方案5】:

            JWT 仍然使用 fire 方法,并且在 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);

            你只能用dispatch 替换fire 方法,因为fire 方法在Laravel 5.8 中不可用,而最新的方法是使用dispatch 方法。

            我希望这个解决方案能与你一起工作..

            【讨论】:

            • 您永远不应该编辑vendor 中的任何内容。它会随着下一个composer update 或部署而消失。您应该更新 tymon/jwt-auth - 更新的版本在 Laravel 5.8 中运行良好。
            • 我只是安装 JWT 现在它已经更新了.. 我只在tymon/jwt-auth 内部进行更改,并且在composer update 之后它不会消失希望你给我另一个解决方案如果你有?
            【解决方案6】:

            将 laravel 更新到 5.8 时,请注意:

            火法影响可能性:

            fire 方法(在 Laravel 5.4 中已弃用Illuminate\Events\Dispatcher 类已移除。您应该使用 dispatch 方法。

            查看更多:https://laravel.com/docs/5.8/upgrade#events

            对于旧的 jwt,他们使用 fire 方法,因此您的代码是错误的。关注并修复它:

            更新 Jwt 到新版本 -> 1.0.0-rc.4

            将 "tymon/jwt-auth": "^1.0.0-rc.4" 添加到您的 composer.json 文件并运行 “作曲家更新

            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/

            -> 在 Model Users 中添加新代码:

            use Tymon\JWTAuth\Contracts\JWTSubject;
            
            class User extends Authenticatable implements JWTSubject
            

            -> 在 config/jwt.php 中将 providers 更改为

            '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',
                    ],
            

            希望对你有帮助。

            【讨论】:

              【解决方案7】:

              5.8 版的 Laravel Passport 解决方案

              我使用 Laravel Passport 并遇到了同样的问题,在我的情况下,在 vendor/laravel/passsport/src/Bridge/RefreshTokenRepository.php 文件中,第 71 行将 $this->events->fire(...) 方法名称更改为 $this->events->dispatch(...) 这个技巧解决了这个问题,我可以获得令牌.

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-06-10
                • 2018-08-14
                • 2016-01-22
                • 2016-03-10
                • 2017-10-04
                • 2016-10-20
                • 1970-01-01
                相关资源
                最近更新 更多