Архитектура 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
Все статьи данной серии:
В нашем путешествии по миру сокетов мы начали с "верхнего этажа" — WebSocket в браузере,…
В предыдущей статье мы говорили о WebSockets — технологии, позволяющей создавать интерактивные чаты в браузере.…
Кожа младенца – тонкая и нежная. Еще не справляется с защитой организма от внешних факторов.…
Представьте себе телефонный разговор. Вы звоните другу, он поднимает трубку, и вы можете говорить одновременно,…
Долгое время планшеты воспринимались исключительно как устройства для потребления контента: посмотреть YouTube, полистать ленту новостей…
Вы внесли правки в CSS, исправили критический баг в JavaScript, загрузили файлы на сервер и…