Шаблоны дизайна, найденные в Magento в деталях
- Образец модели представления модели
Model View Controller, сокращенно MVC, - это шаблон проектирования, в котором бизнес, презентация и логика связывания разделены. Magento интенсивно использует XML в качестве шаблонной логики и HTML, смешанный с файлами PHP для своих представлений. Модели поддерживаются ORM Varien. Большая часть бизнес-логики происходит в моделях, тогда как контроллеры отображают данные модели в представления.
Поскольку в Magento его представления «толстые» - они часто содержат много логики - нередко в представлениях есть дополнительный класс PHP (система блоков), который поможет с рендерингом.
- Шаблон переднего контроллера
Шаблон фронт-контроллера обеспечивает наличие единственной и единственной точки входа. Все запросы исследуются, направляются на назначенный контроллер и затем обрабатываются в соответствии со спецификацией. Фронт-контроллер отвечает за инициализацию среды и маршрутизацию запросов к назначенным контроллерам.
Magento имеет только одну точку входа (index.php), которая инициализирует среду приложения (Mage :: app ()) и направляет запрос на правильный контроллер.
- Заводская модель
Как следует из названия, фабричный шаблон отвечает за факторизацию (создание экземпляров) классов. Он широко используется в базе кода Magento и использует систему автозагрузки в Magento. Определив псевдоним в модуле его config.xml, вы дадите фабрике знать, где можно найти классы.
В базовом классе Mage есть различные фабричные вспомогательные методы, и одним из них является getModel (). Он принимает псевдоним для класса и затем возвращает его экземпляр. Вместо включения вызовов, разбросанных по базе кода, шаблон фабрики будет создавать экземпляры классов единообразным образом.
- Шаблон синглтона
Другой способ получить экземпляр класса - вызвать Mage :: getSingleton (). Он принимает псевдоним класса и перед возвратом экземпляра проверяет внутренний реестр, был ли этот класс уже создан ранее - это приводит к общему экземпляру. Примером того, где это является обязательным, является хранилище сеанса, которое должно использоваться совместно с базой кода, а не создаваться заново каждый раз.
- Реестр шаблонов
Все синглтоны хранятся во внутреннем реестре: глобальный контейнер с областью действия для хранения данных. Это не только для внутреннего использования. Методы Mage :: register ($ key, $ value), :: registry ($ key) и :: unregister ($ key) могут соответственно использоваться для хранения, извлечения и удаления данных из реестра. Реестр часто используется для передачи данных между областями, когда они не могут быть переданы, в противном случае.
- Образец прототипа
Там, где останавливается шаблон фабрики (# 3 в нашем списке), там, где продолжается образец прототипа. Он определяет, что экземпляры классов могут извлекать конкретный другой экземпляр класса в зависимости от его родительского класса (прототипа). Примечательным примером является класс Mage_Catalog_Model_Product, который имеет метод getTypeInstance для извлечения конкретного Mage_Catalog_Model_Product_Type с определенным подмножеством методов и свойств, не применимых ко всем продуктам.
Например, Mage_Downloadable_Model_Product_Type в конечном итоге расширяет Mage_Catalog_Model_Product_Type. Если вы выполняете итерацию по заказу и хотите вызвать определенный метод загружаемого продукта, сначала вам нужно будет его разложить с помощью метода getTypeInstance исходного продукта.
- Шаблон пула объектов
ОбъектШаблон пула ct - это просто блок с объектами, поэтому их не нужно выделять и уничтожать снова и снова. Он мало используется в Magento, кроме как для тяжелых задач, где ресурсы могут скоро стать ограниченными, например, для импорта товаров. Пул объектов (управляемый Varien_Object_Cache) доступен с помощью Mage :: objects ().
- Шаблон итератора
Шаблон итератора определяет, что существует общий способ перебора контейнера с объектами. В Magento это обрабатывается с помощью Varien_Data_Collection, которая, в свою очередь, использует различные встроенные PHP-классы (например, ArrayIterator) для обеспечения большего OO-интерфейса для массивов. Это гарантирует, что коллекции моделей всегда будут иметь общий API для итерации, не зависящий от реальных моделей.
- Шаблон отложенной загрузки
Ленивая загрузка гарантирует, что загрузка данных задерживается до того момента, когда это действительно необходимо. Это приводит к меньшему использованию ресурсов. Одно из ленивых способов загрузки Magento - это поведение коллекций. Если вы должны были получить коллекцию продуктов с помощью Mage :: getModel ('catalog / product') -> getCollection (), база данных будет затронута, только когда вы на самом деле получите доступ к коллекции, например, выполнив итерацию по ней или получив количество найденных моделей.
- Шаблон локатора службы
Шаблон локатора службы абстрагируется от извлечения определенной службы. Это позволяет изменить службу, не нарушая ничего (поскольку она придерживается своей абстрактной основы), а также извлекая службу, если она подходит для этой цели.
Райан иллюстрирует это соединениями с базой данных. Другой пример - это механизм кэширования Magento, в котором Mage :: getCache () является прокси-сервером поиска сервисов для хранения кэша, предоставляемого Zend или другими поставщиками.
- Шаблон модуля
Любой, кто знаком с разработкой Magento, наткнулся на шаблон модуля. Он в основном определяет, что разные домены сгруппированы в отдельные модули, которые функционируют независимо друг от друга и могут быть подключены к основной системе, если это будет сочтено целесообразным. В идеальной ситуации реализация шаблона модуля гарантирует, что каждый элемент может быть удален или заменен. Одним из главных героев шаблона модуля в PHP является менеджер пакетов Composer.
Хотя Magento в значительной степени опирается на модульную архитектуру, она не является модульной до мозга костей. Определенная функциональность тесно связана с ядром и не может быть легко изменена. Также широко используется суперглобальный базовый класс Mage, который вводит все виды общесистемных зависимостей, которые нелегко контролировать.
- Шаблон наблюдателя
Magento, его управляемая событиями архитектура, является результатом реализации шаблона наблюдателя. Определяя наблюдателей (или слушателей), можно подключить дополнительный код, который будет вызываться при возникновении наблюдаемого события. Magento использует свое хранилище XML-данных для определения наблюдателей. Если событие вызывается с помощью Mage :: dispatchEvent ($ eventName, $ data), будет проведено обращение к хранилищу данных и будут запущены соответствующие наблюдатели для $ event.