Как вы переопределяете класс из исходного кода Laravel? - PullRequest
0 голосов
/ 17 мая 2019

Мне нужно внести изменения в функцию retrieveUser () в Illuminate / Broadcasting / Broadcasters / Broadcaster.php.

Изменение работает, если я редактирую класс напрямую, но я слышал, что вы не должны этого делать, потому что сложно отслеживать изменения в исходном коде и потому, что он будет перезаписан при обновлении Laravel или при переходе в рабочий режим .

Так что, если я хочу написать свою собственную модифицированную функцию retrieveUser () для класса Broadcaster (это абстрактный класс, реализующий BroadcasterContract), то где и как я это сделаю?

Оригинальная функция:

    /**
     * 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;
            }
        }
    }

UPDATE Как отметил @ggdx в комментариях, я могу переопределить класс, выполнив class yourClass extends Illuminate\Broadcasting\Broadcasters\Broadcaster Тем не менее, я до сих пор не знаю , где , чтобы поместить этот новый класс в структуру Laravel. Я попытался создать новый класс в / app route, но это не сработало.

1 Ответ

1 голос
/ 17 мая 2019

Я не совсем уверен, чего вы пытаетесь достичь. Но я думаю, что создание специального драйвера для охранника будет делать то, что вы хотите. Глядя на документы 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.

...