Масштабируемый дизайн Laravel 4 с использованием Repository Pattern (при поддержке Eloquent) и Caching

Здравствуйте, удивительные пользователи StackOverflow, надеюсь, вы можете помочь мне с некоторыми ответами и мнениями.

Я разрабатываю систему, в которой Laravel 4 был выбран в качестве фреймворка.
Я столкнулся с проблемами при попытке выполнить модульное тестирование из-за сложности ActiveRecord, которую Laravel использует через Eloquent.

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

С учетом вышесказанного я начал использовать его, и он позволил хорошо интегрировать модульные тесты и использовать IoC. (Я создал свои собственные Простые Старые Объекты и в репозиториях, которые я отображаю между моделью Eloquent и этими объектами)

Все идет нормально, но теперь вот две мои основные проблемы:

  • А) Как легко добавить кеширование?
  • Б) Как сохранить согласованность кэширования, когда несколько репозиториев используют модели Eloquent?

Я читал документацию Laravel и некоторые посты в Интернете, и кажется, что даже при включении кэширования (memcache) в файле конфигурации единственный способ фактически использовать его — создать QueryBuilder экземпляр из модели, а затем с помощью remember() метод.

Но для этого необходимо, чтобы каждый репозиторий, использующий модель, создавал конструктор, а разработчики не забывали использовать remember() метод.

Я что-то пропустил? Есть ли лучший способ для этого?

Единственный способ, которым я мог придумать, это переопределить newBaseQueryBuilder() метод на конкретной модели Eloquent и вызвать remember() метод до возвращения экземпляра, но чувствует себя немного хакером.

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


Если у меня есть несколько репозиториев, которые влияют на одну и ту же модель, так как кеш не очень хорошо очищается, если мы начнем использовать Cache Фасад для обработки кеширования отдельно, он очень быстро станет неуправляемым, не масштабируемым и подверженным ошибкам.

Чтение некоторых постов и блогов (http://culttt.com/2014/02/03/laravel-4-cache-service/) и имеет несколько хороших идей в основном использовать Декоратор Pattern поэтому мы делаем Cachable реализацию репозитория.

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


Здесь я спрашиваю о решениях, которые вы могли придумать или реализовать, а также о моей следующей идее.

идея

  • Продолжайте использовать шаблон репозитория (однако не делайте его реализацию специфичной для ORM, т.е. EloquentUserRepository)
  • Используйте шаблон объекта доступа к данным, чтобы обернуть модели.
  • Мои DAO, в свою очередь, обеспечат Eloquent для конкретной реализации.
  • Используйте Шаблон декоратора в DAO для обеспечения уровня кэширования, и благодаря шаблону он также позволяет сохранять логику кэширования довольно центрированной и слабо связанной.
  • Заставьте репозитории использовать DAO
  • Используя поставщиков услуг, я мог бы потенциально иметь разные механизмы кэширования в зависимости от объектов (статические данные будут использовать APC, в то время как более быстрые данные будут в Memcache, а другие, возможно, в Membase, возможно)

    .

Спасибо за вашу помощь и мнения.

2

Решение

Джеффри Уэй много тестирует и много писал на эту тему для laravel. Вот художественная статья, с которой я столкнулся для тестирования в моделях. Это может или не может помочь. — http://code.tutsplus.com/tutorials/testing-like-a-boss-in-laravel-models—net-30087

https://www.youtube.com/watch?v=ajoFwWwSHTI

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]