Практика
Паттерны проектирования – одна из первых тем, которую мы рассмотрим. Многие разработчики забывают о них при построении своих приложений. Паттерны по сути не дают готовое решение задачи, но зато их используют как основу для понимания и осмысливания многих «шаблонных ситуаций» при написании кода.
В Magento паттерны — фундаментальная основа, что выводит ее на уровень выше с конкурирующими платформами. Здесь все доступно уже из коробки и даже многое уже реализовано, остается только знать где это нужно и как оно работает. Разберем коротко, где и как скрыты основные паттерны в Magento.
Модель-представление-контроллер, кратко MVC – это шаблон проектирования, в котором бизнес-процессы, представление и соединяемая логика разделены.
Magento активно использует XML как шаблонную логику и смешанный HTML с PHP-файлами для ее применения. Все модели основываются на Varien’s ORM.
Большая часть бизнес-логики реализована в моделях (model), которая через контроллеры (controller) выводится в представления (view).
Этот шаблон позаботится о том, чтобы была одна и только одна точка для входа (в Magento это файл index.php). Все запросы отслеживаются и направляются в назначенный контроллер, затем обрабатываются в соответствии со спецификацией. Фронтенд-контроллер (Mage::app()) отвечает за инициализацию среды и маршрутизацию запросов до указанных контроллеров.
Как следует из названия, этот паттерн использует разложение класса на составляющие подклассы с инстанцированием (созданием экземпляра объекта). Он широко задействован в нативном коде Magento и автозагрузки ядра системы. Путем назначения псевдонимов в файле config.xml мы позволяем фабрике узнать где искать нужные классы.
Существуют разные вспомогательные фабричные методы в Mage-Core-классе (например, getModel()). Они принимают псевдоним класса и потом будут возвращать его экземпляр.
Вместо того, чтобы использовать при подключении вызовы include, разбросанные по ядру системы, фабричный паттерн собирает все в один глобальный класс.
Где заканчивает свою работу паттерн Фабрики, там продолжает работать паттерн Прототип. Он определяет, могут ли экземпляры классов извлечь определенные данные из экземпляра
другого класса в зависимости от его родительского класса (прототипа). Ярким примером может служить клас Mage_Catalog_Model_Product, который имеет метод getTypeInstance
для извлечения конкретного класса Mage_Catalog_Model_Product_Type с определенным набором уникальных методов и свойств, применимых к отдельным продуктам.
Каждый, кто детально знакомится с разработкой на CMS Magento, рано или поздно сталкивается с паттерном Модуль. Он определяет как разные домены группируются в отдельные модули таким образом, что не мешают для функционирования один другому и могут использовать функционал для работы из директории с модулями (scope) основной системы. Но, хотя мажента опирается на модульную структуру, ее реализация внутри ядра платформы немодульна “до костей”. Определенная функциональность сильно привязана к центру системы и не может быть легко изменена. Примером может послужить тот же супер-глобальный Mage-класс, который вводит разные общесистемные зависимости. Эти зависимости трудно контролировать.
Еще одним способом получить экземпляр класса является вызов метода Mage::getSingleton(). Он принимает псевдоним класса и до возвращения экземпляра проверяет внутренний реестр на наличие такого при инстанцировании. Примером применения служит хранилище сеанса, которое должно существовать только в одном экземпляре.
Все одиночные экземпляры хранятся во внутреннем реестре: такой себе глобальный scope-контейнер для размещаемых данных. Но он не только для внутреннего (закрытого) использования. Мы можем свободно брать из него необходимые данные для своих нужд.
Методы Mage::register($key, $value), ::registry($key) и ::unregister($key) могут быть соответственно использованы для хранения, извлечения и удаления данных.
Паттерн реестра часто применяется для передачи данных между разными scope (директориями для кода). В Magento их три: core, community, local.
Magento в его событийно-ориентированной архитектуре широко применяет шаблон Observer. По определению наблюдателей (или слушателей), дополнительный код может быть повешен на специальное событие-слушатель, которое вызывается в качестве наблюдаемого события. Magento использует свое XML-хранилище данных, чтобы определить наблюдателей. Если событие вызывается в виде: Mage::dispatchEvent ($eventName, $data), хранилище данных Magento будет извещено и соответствующие наблюдатели запустят свои события ($event).
Выше описана лишь часть из основных паттернов, которые задействованы в Magento. Некоторые из них претерпели изменения по сравнению с классическим представлением шаблонов. Но это хорошо, потому что паттерны проектирования существуют лишь для того, чтобы помочь разработчикам в понимании общей идеи вместо развертывания дословной реализации.
Комментарии
Оставить комментарий
Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)
Термины: Выполнение скриптов на стороне сервера PHP (LAMP) NodeJS (Backend)