Архитектура Model-View-Controller (MVC) походит из языка программирования Smalltalk и Xerox Parc. С тех пор появилось много новых систем, которые описывают свою архитектуру как MVC. Каждая система отличается, но все они ставят своей целью разделения доступа к данным, бизнес-логике и интерфейсу.
Архитектура большинства PHP MVC фреймворков будет выглядеть примерно так:
В то время, как данная модель является большим шагом вперед (от паттерна «каждый файл является страницей», который был в начале), для некоторых программистов это все еще кажется «неотесанным». Общими претензиями к подобной модели являются:
Как вы, наверное, догадались, команда Magento поддерживает это мировоззрение и создала более абстрактный MVC-шаблон, который выглядит примерно так:
Мы, со временем, подробнее осмотрим каждую часть этого процесса, но сейчас мы сосредоточимся на секции Front Controller -> Routers -> Action Controller
Достаточно теории, пришла пора создать Hello World. Мы собираемся:
Во-первых, мы создадим структуру папок для этого модуля. Наша структура папок должна выглядеть следующим образом (вы должны использовать свое пространство имен):
app/code/local/Alanstormdotcom/Helloworld/Block app/code/local/Alanstormdotcom/Helloworld/controllers app/code/local/Alanstormdotcom/Helloworld/etc app/code/local/Alanstormdotcom/Helloworld/Helper app/code/local/Alanstormdotcom/Helloworld/Model app/code/local/Alanstormdotcom/Helloworld/sql
Затем создаем конфигурационный файл для этого модуля (по адресу app/code/local/Alanstormdotcom/Helloworld/etc/config.xml
):
<config> <modules> <Alanstormdotcom_Helloworld> <version>0.1.0</version> </Alanstormdotcom_Helloworld> </modules> </config>
Затем создаем файл для активации модуля (по адресу app/etc/modules/Alanstormdotcom_Helloworld.xml
):
<config> <modules> <Alanstormdotcom_Helloworld> <active>true</active> <codePool>local</codePool> </Alanstormdotcom_Helloworld> </modules> </config>
Наконец убеждаемся, что наш модуль активен:
Alanstormdotcom_Helloworld
.
Далее мы собираемся настроить маршрутизацию (routes). Маршрутизация будет превращать URL-запрос в действие (Action Controller) и метод. В Magento, в отличие от других PHP MVC-систем, вы должны явно определять маршрутизацию (routes) в глобальной Magento-конфигурации.
В файл config.xml
добавьте следующую секцию:
<config> ... <frontend> <routers> <helloworld> <use>standard</use> <args> <module>Alanstormdotcom_Helloworld</module> <frontName>helloworld</frontName> </args> </helloworld> </routers> </frontend> ... </config>
Здесь у нас есть много новых терминов, давайте разберем их.
Что такое <frontend>
?
Тег <frontend>
относится к областям (Area) Magento. Сейчас думайте об областях, как об индивидуальных Magento-приложениях. Область «frontend» – это внешний вид приложения Корзины Мадженто. Область «admin» – это приватное приложение административной консоли. Область «install» – это приложение, которое вы используете для запуска процесса установки Magento.
Почему теги <routers>
настроены на индивидуальные маршруты?
Есть известная цитата о компьютерной науке, которую часто связывают с Филом Карлтоном:
«Есть только две тяжелые вещи в компьютерной науке: валидация кэша и именование вещей»
Magento, как и все большие системы, страдает от проблем избыточного именования. Вы найдете много мест в глобальном настройке (global config), и в системе в целом, где именование интуитивно непонятное, или даже совсем неоднозначное. Маршрутизация – одно из таких мест.
Что такое <frontName>
?
Когда маршрутизатор (router) анализирует URL, то он получает разделенные запросы
VASH-DOMEN/frontName/actionControllerName/actionMethod/
Поэтому, при определении «helloworld» в <frontName>
теге, мы говорим Magento, что нам нужен ответ URL в виде
VASH-DOMEN/helloworld/*
Многие новички в Magento путают этот frontName с объектом Front Controller. Это не то же самое. FrontName относится исключительно к маршрутизации (routers).
Для чего тег <helloworld>
?
Этот тег должен именоваться именем модуля в нижнем регистре. У нас модуль Helloworld, значит имя тега – helloworld. Этот тег, технически, определяет название нашего маршрута.
Вы также заметите, что наш frontName совпадает с именем нашего модуля. Это свободная конвенция, чтобы frontName’ы совпадали с названиями модулей, но это не является обязательным требованием. На самом деле, один модуль может определять несколько <routers>
и, как результат, может иметь несколько frontName.
Для чего нужен <module>Alanstormdotcom_Helloworld</module>
?
Этот тег должен содержать полное название вашего модуля, включая имя package/namespace
. Это будет использоваться системой для размещения (определение) наших файлов контроллера.
Последний шаг, и у нас будет свой контроллер. Создайте файл в:
app/code/local/Alanstormdotcom/Helloworld/controllers/IndexController.php
Со следующим содержанием:
class Alanstormdotcom_Helloworld_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo 'Hello World!'; } }
Очистите кэш и загрузите веб-страницу по следующей ссылке:
VASH-DOMEN/helloworld/index/index
Также, вы должны проверить загрузку страниц:
VASH-DOMEN/helloworld/index/ VASH-DOMEN/helloworld/
Должна появиться пустая страница с текстом «Hello World!». Поздравляем, вы настроили свой первый контроллер Magento!
Где размещаются контролеры?
Контроллеры должны быть размещены в модуле, в папке «controllers» (название в нижнем регистре). Это то место, где система будет искать их.
Как назвать контролеры?
Помните тег <module>
, содержащийся в config.xml
?
<module>Alanstormdotcom_Helloworld</module>
Название контроллера будет:
Alanstormdotcom_Helloworld
)Alanstormdotcom_Helloworld_
)Alanstormdotcom_Helloworld_Index
)Alanstormdotcom_Helloworld_IndexController
)
Все Action контроллеры должны расширять класс Mage_Core_Controller_Front_Action
.
index/index
– что это за нонсенс?
Как упоминалось ранее, все URL в Magento ведут (по умолчанию) по адресу
VASH-DOMEN/frontName/actionControllerName/actionMethod/
Таким образом, в URL
VASH-DOMEN/helloworld/index/index
частица URI «helloworld» – является frontName, за которым следует индекс (имя Action контроллера), за которым следует другой индекс, который является именем Action метода, который будет вызываться. (Экшен index будет вызывать метод public function indexAction(){...}
.)
Если URL является неполным, Magento использует «index» по умолчанию. Поэтому, следующие адреса эквивалентны:
VASH-DOMEN/helloworld/index/ VASH-DOMEN/helloworld/
Если бы у нас был URL в таком виде
VASH-DOMEN/checkout/cart/add
тогда Magento будет:
Mage_Checkout
)Mage_Checkout_CartController
)addAction
в контроллере корзины
Давайте попробуем добавить нестандартный метод к нашему контроллеру. Добавьте следующий код в файл IndexController.php
public function goodbyeAction() { echo 'Goodbye World!'; }
и перейдите по URL для проверки
VASH-DOMEN/helloworld/index/goodbye
Поскольку мы расширяем класс Mage_Core_Controller_Front_Action
, это дает нам некоторые методы бесплатно. Например, дополнительные элементы URL, которые автоматически разбираются на пары key/value. Добавьте следующий метод к контроллеру.
public function paramsAction() { echo '<dl>'; foreach($this->getRequest()->getParams() as $key=>$value) { echo '<dt><strong>Param: </strong>'.$key.'</dt>'; echo '<dl><strong>Value: </strong>'.$value.'</dl>'; } echo '</dl>'; }
и посетите следующий URL
VASH-DOMEN/helloworld/index/params?foo=bar&baz=eof
Вы должны увидеть вывод каждого параметра и его значение.
Наконец, что нам нужно сделать, если бы мы хотели URL вида
VASH-DOMEN/helloworld/messages/goodbye
Здесь имя экшн контроллера messages, поэтому мы должны создать файл в
app/code/local/Alanstormdotcom/Helloworld/controllers/MessagesController.php
с названием контроллера
Alanstormdotcom_Helloworld_MessagesController
и методом, который выглядел бы примерно так
public function goodbyeAction() { echo 'Another Goodbye'; }
И это только поверхностное описание того, как Magento реализует контроллерную часть MVC. Хотя это немного сложнее, чем в других PHP MVC-фреймворках. Но эта система очень гибкая, и она позволит вам построить практически любую структуру URL, которую только пожелаете.
Автор: Alan Storm (http://alanstorm.com/magento_controller_hello_world/)
Перевод на русский: SebWeo
Предыдущая статья темы: Magento для PHP MVC разработчиков (Alan Storm) – ч.1/11
Все статьи данной серии:
Содержание статьи Введение: почему цены решают все Что значит сравнение цен с конкурентами 5 причин,…
В последние годы интерес к саунам в Киеве заметно вырос. Это связано не только с…
В современном ритме мегаполиса отдых стал неотъемлемой частью заботы о здоровье и эмоциональном состоянии. Особенно…
В современном мире цифрового маркетинга Facebook (Meta) остается одной из самых мощных платформ для продвижения…
Этот прибор стал незаменимым элементом арсенала представителей множества профессий, но особенно актуален среди военных. Тепловизор…
Постоянный поток новостей, рабочих задач и личных забот часто приводит к тому, что в голове…