Как забиндить две реализации интерфейса для гостя и авторизованного пользователя соответственно?

Есть сервис для работы с корзинойCartService, данный сервис использует репозиторий CartGuestRepositoryи CartCustomerRepository, которые реализуют интерфейс CartRepositoryInterface.

Репозиторий для гостя получает данные по корзине из сессии, репозиторий для покупателя - из базы данных.

Хочу в зависимости от того, авторизован пользователь или нет - биндить нужный репозиторий, но такая реализация в сервис провайдере не работает:

if (Auth::check()) {
            app()->singleton(CartRepositoryInterface::class, CartCustomerRepository::class);
        } else {
            app()->singleton(CartRepositoryInterface::class, CartGuestRepository::class);
        }


так как на этом этапе Auth::check() всегда возвращает false. Каким способом можно подобные задачи решать?
  • Вопрос задан
  • 278 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Вместо провайдера можно использовать глобальный middleware. Не очень красиво, но технически - это самый прямой способ добиться нужного результата.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Комментировать
@v__V__v
Разработчик
Auth::check() работает только после того, как пользователь прошел (или не прошел) аутентификацию. Судя по всему, вы используете вызов там, где это еще неизвестно, посмотрите, где вы свой сервис-провайдер подключаете. Если вы используете этот вызов в стандартном AppServiceProvider, то там он работать конечно не будет, лучше переместите в какую-то прокладку (middleware), как вам посоветовали выше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы