如何覆盖 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 配置文件中将其作为您的保护程序的驱动程序。
我需要更改 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 配置文件中将其作为您的保护程序的驱动程序。