【发布时间】: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