Архітектура 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
Якщо ви плануєте розмістити веб-сайт в мережі Інтернет, дуже важливо знайти для нього швидкий і…
Навчання за кордоном вже давно асоціюється з якісною освітою, новими можливостями та безліччю перспектив. Але…
Вибір майстра для ремонту та перетяжки меблів – завдання, яке потребує вдумливого підходу. Адже від…
Вибір ідеального хостингу під свій сайт може бути досить заплутаною справою, особливо коли існує багато…
Щоб уникати помилок, потрібно набиратися досвіду; щоб набиратися досвіду, потрібно робити помилки Лоуренс Пітер
Коротке визначення Чорного SEO Чорне СЕО (або Чорна оптимізація) — це будь-яка практика, метою якої…