如何覆盖 Laravel 源代码中的 class?

How do you override a class from the Laravel source code?

我需要更改 Illuminate/Broadcasting/Broadcasters/Broadcaster.php.

中的 retrieveUser() 函数

如果我直接编辑 class,更改会起作用,但我听说您不应该这样做,因为很难跟踪对源代码的更改,而且在升级时它会被覆盖Laravel 或推向生产时。

因此,如果我想为 Broadcaster class 编写自己的修改后的 retrieveUser() 函数(它恰好是一个实现 BroadcasterContract 的抽象 class),那么我应该在哪里以及如何做那?

原函数:

    /**
     * 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 覆盖 class 但是,我仍然不知道 将这个新的 class 放在 Laravel 框架中。我尝试在 /app 路径中创建新的 class,但是没有用。

我不完全确定你想要完成什么。但我认为为守卫定制一个驱动程序会做你想做的。查看文档 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')));
});

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