AnisimovAM
@AnisimovAM
Программист

Symfony и Redis куда писать логику получения кэша?

Добрый день.

Пишу проект на symfony. Есть задача результаты некоторых запросов закешировать в redis.
Написал сервис для получения данных из кэша и записи данных в кэш, используя адаптер RedisAdapter из компонента Symfony/Cache.

Куда писать логику вида "если есть кэш, отдаем кэш, иначе из БД" (в примере я запихал в экшен контроллера) ?
public function getUsersAction()
    {
        $redisHelper = $this->get('app.redis.helper');

        $cache = $redisHelper->getCache('users_list');

        if ($cache) {
            return $cache;
        }

        $users = $this->getDoctrine()->getRepository(User::class)->findAll();
        $redisHelper->setCache('users_list', $users);

        return $users;
    }


Варианты:
1. В экшене контроллера
2. В методе репозитория (если тут, то как заинжектить свой сервис туда?)
3. Где-то еще

Хочу понять как делать правильно.
  • Вопрос задан
  • 1888 просмотров
Решения вопроса 2
lexxpavlov
@lexxpavlov
Программист, преподаватель
Сделать сервис, в нём методы получения данных. В методах доступ к кэшу и к репозитоиям.
В идеале, в контроллере вообще не нужны репозитории - вся работа с ними в этом сервисе.
В этом сервисе и инвалидация делается.
Методы могут быть по конкретной сущности, а могут быть по типу (getEntity($type, $id)), если удобно.

UPD. В качестве инструмента рекомендую использовать компонент Cache Component, в нём есть возможность использовать тегирование записей, это очень удобно (для инвалидации)! Doctrine Cache устарел, имхо.
Ответ написан
Комментировать
@mistergonza
PHP6 evangelist
Делайте отдельный сервис. В сервисе метод получения списка пользователей в котором и воткнете нужные проверки. Особенно если у вас список пользователей потребуется в разным местах, а затем вы решите сменить механизм кеширования, вам достаточно будет поправить логику только в одном месте. В сервис можно будет добавить кучу еще всяких методов, например удаление пользователя, который будет дропать пользователя сразу и из кеша и из базы, или получение списка подчиненных, который у каждого авторизированного пользователя разный. Кароче инкапсуляция во всей красе.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Kostik_1993
Fullstack Web Developer | PHP | Laravel | Vue.js
И пусть меня затопчат, но как по мне, чем глубже мы закапываем логику выбора из кеша или бд, тем меньше пользы он нам вообще принесет. Кеширование нужно ставить максимально ближе к запросу, получил запрос есть в кеше отдал, нет пошел дальше. Поэтому в контроллере как мне кажется ему и самое место. Главное это написать все красиво и не навредить.
Ответ написан
Комментировать
@oxidmod
сделать кеширующий декоратор для репы
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы