您如何覆盖Laravel源代码中的类?

时间:2019-05-17 12:46:05

标签: laravel laravel-5 eloquent laravel-5.2 laravel-echo

我需要对Illuminate / Broadcasting / Broadcasters / Broadcaster.php中的retrieveUser()函数进行更改。

如果我直接编辑该类,则更改有效,但是我听说您不应该这样做,因为很难跟踪对源代码的更改,并且由于在升级Laravel或推向生产环境时它将被覆盖

因此,如果我想为Broadcaster类编写自己的修改后的restoreUser()函数(它恰好是实现BroadcasterContract的抽象类),那么我将在哪里以及如何做到这一点?

原始功能:

    /**
     * Retrieve the authenticated user using the configured guard (if any).
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $channel
     * @return mixed
     */
    protected function retrieveUser($request, $channel)
    {
        $options = $this->retrieveChannelOptions($channel);

        $guards = $options['guards'] ?? null;

        if (is_null($guards)) {
            return $request->user();
        }

        foreach (Arr::wrap($guards) as $guard) {
            if ($user = $request->user($guard)) {
                return $user;
            }
        }
    }

新功能:

protected function retrieveUser($request, $channel)
    {
        $options = $this->retrieveChannelOptions($channel);

        $guards = $options['guards'] ?? null;

        if (is_null($guards)) {
            $token = $request->header('Token');
            $id = Crypt::decrypt($token);
            $user = User::find($id);
            return $user;
        }

        foreach (Arr::wrap($guards) as $guard) {
            if ($user = $request->user($guard)) {
                return $user;
            }
        }
    }

更新 正如@ggdx在评论中指出的那样,我可以通过执行class yourClass extends Illuminate\Broadcasting\Broadcasters\Broadcaster来覆盖该类。 但是,我仍然不知道将该新类放在Laravel框架中的位置。我尝试在/ app路由中创建新类,但这没用。

1 个答案:

答案 0 :(得分:1)

我不确定您要完成什么。但是我认为为后卫定制一个司机会做你想要的。查看文档https://laravel.com/docs/5.8/authentication#adding-custom-guards

您可以在AuthServiceProvider的启动方法中执行此操作。

Auth::viaRequest('custom-token', function ($request) {
    return User::find(Crypt::decrypt($request->header('Token')));
});

另外,请确保在auth.php配置文件中将其选择为保护您的驱动程序。