@D3lphi

Кеширование: репозиторий или модель?

Уже не раз задавался вопросом, читал ответы на тостере по этому поводу, но не разу не видел однозначного ответа. Так вот, вопрос: Где правильнее, с точки зрения архитектуры (В Laravel приложении), будет хранить логику кеширования (Например, если есть данные в кеше, вытащить их, иначе отдать данные из БД) в репозитории или в модели? Вроде, как модель отвечает за работу с данным, хотя с другой, слышал мнение, что модель - это простой POPO.
  • Вопрос задан
  • 609 просмотров
Пригласить эксперта
Ответы на вопрос 2
Falseclock
@Falseclock
решаю нестандартные задачи
Я написал свой драйвер еще 10 лет назад и проблем не знаю.

$sth = $db->prepare("SELECT * FROM foo");
$sth->cache("Foo:*");
$sth->execute();


метод execute проверяет было ли значение ключа кэша и если есть, дергает данные из кэша. Если там пусто, делает запрос к базе. 1 раз написал и забыл на долгие годы.

Без указания кэша данные всегда будут дергаться из базы
$sth = $db->prepare("SELECT * FROM foo");
$sth->execute();
Ответ написан
Над репозиторием. Я делал следующим образом: пишу репозиторий, его интерфейс, затем через сервис контейнер привязываю интерфейс к реализации. Позже другой код-код-код, затем спустя некоторое время уже пишу слой кэша и всю логику кэширования. Кэширующий класс наследует тот же самый интерфейс и после написания подставляется в сервис-контейнер вместо текущей реализации. Можно кэширующий слой поставить еще выше, все от вашей архитектуры зависит (поэтому однозначного ответа тоже не будет), но ниже лично я смысла не вижу, может просто примеры не попадались, когда это требовалось. А архитектура в рамках ларавела четко не задана. Есть некие инструменты, описанные в документации, но вы можете строить архитектуру так, как вам кажется наиболее правильным. Я в свое время проникся статьей о гексагональной архитектуре и сейчас изложенные в ней принципы мне очень и очень нравятся (не сказать, что там что-то новое написали, просто разложили по полочкам внятно уже существующие вещи).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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