Подтвердить что ты не робот

Шаблоны проектирования Magento

Magento, IMHO, представляет собой систему PHP, которая построена на хорошо продуманных принципах кодирования - одним из них является использование повторяющихся шаблонов дизайна. Что касается примера системы PHP, я думаю, что ее можно считать довольно передовым и, следовательно, стоит рассмотреть с архитектурной точки зрения.

Как я понимаю, существует множество шаблонов проектирования, доступных разработчику ООП. Увидев, что такие шаблоны используются в системе с открытым исходным кодом, такой как Magento, разработчик может просматривать примеры таких шаблонов в реальном использовании и на месте, а не в примерах, которые иногда могут быть довольно академичными и даже немного вводящими в заблуждение.

Как таковой, мне интересно, какие шаблоны, кроме тех, которые я перечислял ниже, программисты Magento использовали при разработке для Magento.

В качестве примечания я понимаю, что некоторые из этих шаблонов существуют на месте, поскольку они основаны на Zend Framework, MVC/Front Controller - это пара из них,

Очевидными являются:

Factory:

$product = Mage::getModel('catalog/product');

Singleton:

$category = Mage::getSingleton('catalog/session');

Реестр:

$currentCategory = Mage::registry('current_category');
4b9b3361

Ответ 1

Прототип:

Mage:getModel('catalog/product')->getTypeInstance();

Параметр Event-Observer:

# PHP
Mage::dispatchEvent('event_name', array('key'=>$value));

# config.xml
<config>
    <global>
        <events>
            <event_name>
                <observers>
                    <unique_name>
                        <class>Class_Name</class>
                        <method>methodName</method>
                    </unique_name>
                </observers>
            </event_name>
        </events>
    </global>
</config>

Пул объектов:

$id = Mage::objects()->save($object);
$object = Mage::objects($id);

Итератор:

Mage::getModel('catalog/product')->getCollection();

Ответ 2

Шаблоны проектирования, найденные подробно в Magento

  • Шаблон контроллера модели

Model View Controller, MVC для краткости, представляет собой шаблон проектирования, в котором разделяются бизнес-логика, представление и логика связи. Magento в значительной степени использует XML в качестве шаблонов-логики и HTML, смешанных с файлами PHP для своих представлений. Модели поддерживаются Variens ORM. Большинство бизнес-логик происходит в моделях, тогда как контроллеры сопоставляют данные модели с представлениями.

Поскольку Magento его взгляды являются "жирными" - они часто содержат много логики - это не редкость, что представления имеют дополнительный PHP-класс (блок-система), который поможет с рендерингом.

  1. Внешний шаблон контроллера

Образец переднего контроллера гарантирует, что имеется одна и только одна точка входа. Все запросы исследуются, направляются на назначенный контроллер и затем обрабатываются в соответствии со спецификацией. Передний контроллер отвечает за инициализацию запросов среды и маршрутизации назначенным контроллерам.

Magento имеет только одну точку входа (index.php), которая инициализирует среду приложения (Mage:: app()) и направляет запрос на правильный контроллер.

  1. Factory Шаблон

Как подразумевается именем, шаблон factory отвечает за факторизующие (создающие экземпляр) классы. Он широко используется через базу кода Magento и использует систему автозагрузки в Magento. Определив псевдоним в модуле своего config.xml, вы даете factory знать, где он может найти классы.

В базовом классе Mage существуют различные методы factory -helper, а один из них - getModel(). Он принимает псевдоним для класса и затем возвращает его экземпляр. Вместо включения вызовов, разбросанных по базе кода, шаблон factory будет создавать классы равномерным образом.

  1. Шаблон Singleton

Другой способ получить экземпляр класса - вызвать Mage:: getSingleton(). Он принимает псевдоним класса и перед возвратом экземпляра проверяет внутренний реестр, был ли этот класс уже создан ранее - это приводит к общему экземпляру. Пример того, где это является обязательным, - это хранилище сеансов, которое должно делиться через базу кода, а не создавать его заново каждый раз.

  1. Шаблон реестра

Все сингллеты хранятся во внутреннем реестре: контейнер с глобальным охватом для хранения данных. Это не только для внутреннего использования. Методы Mage:: register ($ key, $value),:: registry ($ key) и:: unregister ($ key) могут быть соответственно использованы для хранения, извлечения и удаления данных из реестра. Реестр часто используется для передачи данных между областями, когда они не могут быть переданы, в противном случае.

  1. Шаблон прототипа

Если шаблон factory (№3 в нашем списке) останавливается, это продолжение шаблона прототипа. Он определяет, что экземпляры классов могут извлекать конкретный экземпляр другого класса в зависимости от его родительского класса (прототипа). Примечательным примером является класс Mage_Catalog_Model_Product, который имеет метод getTypeInstance для извлечения определенного Mage_Catalog_Model_Product_Type с определенным подмножеством методов и свойств, не применимых ко всем продуктам.

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

  1. Шаблон пула объектов

Шаблон пула объектов - это просто поле с объектами, поэтому им не нужно выделять и уничтожать снова и снова. Он не используется много в Magento, кроме как для тяжелых задач, где ресурсы могут скоро быть ограничены, например, импортировать продукты. Пул объектов (управляемый Varien_Object_Cache) может быть доступен с помощью Mage:: objects().

  1. Итератор

Шаблон итератора определяет, что существует общий способ итерации по контейнеру с объектами. В Magento это обрабатывается Varien_Data_Collection, который в свою очередь использует различные запеченные PHP-классы (например, ArrayIterator) для получения большего количества OO-интерфейса для массивов. Это гарантирует, что коллекции моделей всегда будут иметь общий API для итерации, не завися от реальных моделей.

  1. Lazy Loading Pattern

Lazy loading гарантирует, что загрузка данных задерживается до момента, когда это действительно необходимо. Это приводит к тому, что используются меньше ресурсов. Одно из ленивых нагрузочных действий Magento - это коллекции. Если вы хотите получить коллекцию продуктов с помощью Mage:: getModel ('catalogue/product') → getCollection(), база данных будет затронута только тогда, когда вы действительно получите доступ к коллекции, например, итерации по ней или извлечение количество найденных моделей.

  1. Шаблон локатора обслуживания

Шаблон локатора службы абстрагирует извлечение определенного сервиса. Это позволяет менять сервис, не нарушая ничего (поскольку он придерживается его абстрактного фундамента), а также получает услугу, как видно, подходит для своей цели.

Ryan иллюстрирует это с подключением к базе данных. Другим примером является метод Magento для кэширования, в котором Mage:: getCache() является локальным прокси-сервером службы для хранилища кешей, поставляемого Zend или другими поставщиками.

  1. Шаблон модуля

Любой, кто знаком с разработкой Magento, наткнулся на шаблон модуля. Он в основном определяет, что разные домены сгруппированы в отдельные модули, которые функционируют независимо друг от друга и могут быть подключены к основной системе по своему усмотрению. В идеальной ситуации реализация шаблона модуля гарантирует, что каждый элемент может быть удален или заменен. Одним из главных героев шаблона модуля в PHP является менеджер пакетов Composer.

Хотя Magento сильно полагается на модульную архитектуру, она не модульная до кости. Некоторые функции сильно привязаны к ядру и не могут быть легко изменены. Существует также интенсивное использование супер-глобального основного класса Mage, который вводит все виды зависимостей в системе, которые нелегко контролировать.

  1. Шаблон наблюдателя

Magento его управляемая событиями архитектура является результатом реализации шаблона наблюдателя. Определяя наблюдателей (или слушателей), может быть подключен дополнительный код, который будет вызван по мере возникновения наблюдаемого события. Magento использует хранилище данных XML для определения наблюдателей. Если событие запускается с помощью Mage:: dispatchEvent ($ eventName, $data), будет храниться хранилище данных, и соответствующие обозреватели для $event будут уволены.

Ответ 3

Еще несколько:

Событие/Слушателей

Mage::dispatchEvent('model_load_before', $params); 

И, конечно, MVC, при этом представления представляются комбинацией XML, PHP-классов и шаблонов PHTML.

Ответ 4

Не забывайте о Lazy Loading, что означает, что доступ к базе данных происходит только тогда, когда это необходимо. Например:

$collection_of_products = Mage::getModel('catalog/product')
->getCollection();
$collection_of_products->addFieldToFilter('sku','n2610');

Запрос базы данных не будет выполнен, пока вы не попытаетесь получить доступ к элементу в коллекции.

Ответ 5

Я думаю, что отношения между Mage_Checkout_Model_Cart и Mage_Sales_Model_Quote - это шаблон дизайна Bridge. Как определено wikipedia Bridge, это означает "отделить абстракцию от ее реализации, чтобы они могли варьироваться независимо". Таким образом, Cart, кажется, является абстракцией, а Quote, похоже, является реализацией.

Ответ 6

Локатор сервисов

Allows overrides or renamed physical resources (e.g. Classes, DB tables, etc)

Mage::getModel('catalog/product') и $installer->getTable('customer/address_entity')

Ответ 7

Ниже приведены шаблоны проектирования: 1. Управление представлением модели.

  • Singleton

  • Factory

  • Реестр

  • Фронтальный контроллер.

  • Итератор.

  • Lazy Loading.

  • Наблюдатели (события)

Ответ 8

В целом, с моей точки зрения, Magento использует свою собственную уникальную реализацию большинства шаблонов, поэтому не следует делать большую часть сравнения между ними.

Например, в прошлом я видел шаблон создания Factory как класс, который обрабатывает классы группы экземпляров. В Magento объединенный конфигурационный файл xml хранит все пути к моделям, блокам и помощникам, чтобы впоследствии в процессе разработки разработчики указали только уникальный идентификатор для косой черты и фактического имени класса. Модели Singleton и Registry также отличаются от ожидаемых.