Я создаю приложение на PHP, используя Zend Framework 1 и Doctrine2 в качестве слоя ORM. Все идет хорошо. Теперь я заметил, что и ZF1, и Doctrine2 поставляются с собственной реализацией кэширования и полагаются на нее. Я оценил и то и другое, и хотя у каждого есть свои плюсы и минусы, ни один из них не превосходит другого для моих простых потребностей. Кажется, что обе библиотеки написаны для их соответствующих интерфейсов, а не для их реализаций.
Причины, по которым я чувствую эту проблему, заключаются в том, что во время начальной загрузки моего приложения мне приходится настраивать два драйвера кэширования - каждый со своим собственным синтаксисом. Таким образом легко возникает несоответствие, и из-за этого кажется неэффективным устанавливать два подключения к бэкэнду кэширования.
Я пытаюсь определить, каков наилучший способ продвижения вперед, и приветствую любые идеи, которые вы можете предложить.
До сих пор я придумал четыре варианта:
- Ничего не предпринимайте, примите, что присутствуют два класса, предлагающие функциональность кэширования.
- Создайте класс Facade, чтобы прикрепить интерфейс Zend к реализации кэширования Doctrine.
- Вариант 2, наоборот - создать Facade для сопоставления интерфейса Doctrine на сервере Zend Framework.
- Используйте множественное интерфейсное наследование, чтобы создать один интерфейс, чтобы управлять ими всеми, и молитесь, чтобы не было никаких совпадений (то есть: если у обоих есть метод "save", им нужно будет принимать параметры в том же порядке из-за PHP отсутствие правильного полиморфизма).
Какой вариант лучше, или есть вариант «Ни один из вышеперечисленных», о котором я не знаю?
Ответы:
Ничего не делать Примите, что отдельные проекты могут иметь избыточность, если они работают в своих собственных пространствах (не загрязняя друг друга кешами). Доктрина знает, что у Зенда есть кеширование, но они не хотят зависеть от Зенда и наоборот. Не все люди хотят использовать Zend и Doctrine.
Я бы позволил коду Doctrine использовать свои собственные вещи и использовать ZF для всего остального. Таким образом, мне нужно знать только классы ZF. Кэш доктрины должен использоваться доктриной только для объекта базы данных. ZF имеет больше внешнего интерфейса, который полезен вне ORM, например, внешний интерфейс для кэширования HTML-страниц.
Создание другого слоя было бы идеальным, но это добавит еще одну зависимость к проекту, поэтому не очень хорошо для обслуживания.
Я знаю, что в начальной загрузке это может выглядеть избыточно для настройки нескольких кэшей. Это может ухудшиться, если вы попытаетесь использовать ZF1, Doctrine и ZF2 одновременно. Но это очень маленькое постоянное время, так как они только устанавливают переменные, еще не подключаясь к бэк-эндам.
Итак, с точки зрения программирования, обслуживания и эксплуатации, я бы просто оставил их в покое.
источник
Почему бы просто не решить проблему с точки зрения «сделать конфигурацию более удобной»?
Другими словами, напишите некоторый новый класс, который принимает ваши данные конфигурации, а затем применяет их к обоим драйверам кэширования. Конечно, это не так гибко, но это также означает, что меньше может пойти не так.
источник
Почему бы не создать абстракцию вашего интерфейса, которая может быть специализирована для каждой из фреймворков? Я написал бы свой собственный контроллер кэширования с необходимыми мне методами, которые инкапсулировали бы оба кэша. Тогда я могу забыть о них и поговорить только с моим контроллером. Есть проблемы с этим решением?
источник