【问题标题】:How do you override a class from the Laravel source code?你如何覆盖 Laravel 源代码中的类?
【发布时间】:2019-10-04 19:17:29
【问题描述】:

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

如果我直接编辑类,更改会起作用,但我听说你不应该这样做,因为很难跟踪对源代码的更改,并且在升级 Laravel 或推送到生产环境时它会被覆盖.

所以,如果我想为 Broadcaster 类(它恰好是一个实现 BroadcasterContract 的抽象类)编写我自己修改过的 retrieveUser() 函数,那么我将在哪里以及如何做呢?

原函数:

    /**
     * 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 在 cmets 中指出的那样,我可以通过执行 class yourClass extends Illuminate\Broadcasting\Broadcasters\Broadcaster 来覆盖该类 但是,我仍然不知道将这个新类放在 Laravel 框架中的何处。我尝试在 /app 路由中创建新类,但没有成功。

【问题讨论】:

  • class yourClass extends Illuminate\Broadcasting\Broadcasters\Broadcaster 与您的包含您寻求覆盖的方法。非常基本的继承东西。 php.net/manual/en/language.oop5.inheritance.php
  • 谢谢@ggdx - 你把这个类放在你的 /app 根目录或其他地方?如果您想将此作为答案而不是评论发布,我可以将其标记为正确以给予您荣誉。
  • @ggdx 让 Laravel 使用修改后的类可能需要更多的努力。
  • 谢谢@ceejayoz - 这就是我想要完成的,所以任何帮助将不胜感激!
  • @ggdx 看,如果 Laravel 在内部执行 new Illuminate\Broadcasting\Broadcasters\Broadcaster,并且您从 Illuminate\Broadcasting\Broadcasters\Broadcaster 扩展了一个类,Laravel 不会知道您在其他文件中扩展了该类。它将继续愉快地使用内置的。为此,您需要另一段代码:stackoverflow.com/questions/32876280/…

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


【解决方案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 配置文件中选择它作为您的警卫的驱动程序。

【讨论】:

  • 好的,非常感谢您的回复,让我试一试,我会报告的。很酷,您可以在驱动程序中拉入 $request 标头。我不知道。
  • 再次感谢 - 我尝试将 Auth::viaRequest 添加到 AuthServiceProvider 并将 custom-token 保护添加到 auth.php,但我只收到 401 错误:无法验证客户端。即使我尝试手动输入 URL:127.0.0.1:8000/broadcasting/auth?token=1,它仍然说我没有经过身份验证(此尝试没有加密)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 2017-09-25
  • 2010-09-16
相关资源
最近更新 更多