Как переопределить / расширить Broadcasters / Broadcaster.php из исходного кода ядра Laravel? - PullRequest
0 голосов
/ 17 мая 2019

Я написал расширение 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,

    ],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...