Я написал расширение Illuminate/Broadcasting/Broadcasters/Broadcaster.php
, чтобы я мог использовать настраиваемую функцию (retrieveUser()
).
Как мне заставить Laravel использовать его вместо оригинала?
На данный момент я пытался сохранить класс в каталоге app / Providers и в новом каталоге app/Extensions
.
Я пытался вызвать новый класс из config\app.php
, ноЯ либо получаю:
Класс не существует
или:
Вызов неопределенного метода isDeferred ()
Я также пытался создать поставщика услуг для его вызова.
Я также пытался создать пользовательское приложение, которое расширяет приложение по умолчанию как , описанное здесь .Однако в приложении по умолчанию нет ссылок на Illuminate/Broadcasting
, которые можно даже переопределить.
Вот новый класс:
<?php
namespace App\Extensions;
use Illuminate\Support\Arr;
use Illuminate\Broadcasting\Broadcasters\Broadcaster as Broadcaster;
use App\User;
use Illuminate\Support\Facades\Crypt;
class EncryptedBroadcaster extends Broadcaster
{
protected function retrieveUser($request, $channel)
{
$options = $this->retrieveChannelOptions($channel);
$guards = $options['guards'] ?? null;
if (is_null($guards)) {
$authorization = $request->header('Authorization');
$id = Crypt::decrypt($token);
$user = User::find($id);
return $user;
}
foreach (Arr::wrap($guards) as $guard) {
if ($user = $request->user($guard)) {
return $user;
}
}
}
public function auth($request)
{
$channelName = $this->normalizeChannelName($request->channel_name);
if ($this->isGuardedChannel($request->channel_name) &&
! $this->retrieveUser($request, $channelName)) {
throw new AccessDeniedHttpException;
}
return parent::verifyUserCanAccessChannel(
$request, $channelName
);
}
public function validAuthenticationResponse($request, $result)
{
if (is_bool($result)) {
return json_encode($result);
}
$channelName = $this->normalizeChannelName($request->channel_name);
return json_encode(['channel_data' => [
'user_id' => $this->retrieveUser($request, $channelName)->getAuthIdentifier(),
'user_info' => $result,
]]);
}
public function broadcast(array $channels, $event, array $payload = [])
{
$connection = $this->redis->connection($this->connection);
$payload = json_encode([
'event' => $event,
'data' => $payload,
'socket' => Arr::pull($payload, 'socket'),
]);
foreach ($this->formatChannels($channels) as $channel) {
$connection->publish($channel, $payload);
}
}
}
Вот моя попыткапри звонке в config/app.php
:
'providers' => [
// other existing providers ....
App\Providers\EncryptedBroadcaster::class,
],