Команда разработчиков Zend Framework с воодушевлением работает над Zend Framework, фреймворком для построения мощных веб-приложений на PHP. Но очень многих смущает его кажущаяся сложность. В этой заметке я попытаюсь объяснить архитектуру наиболее важной части (по моему мнению) фреймворка - Zend_Controller.
Для начала, рассмотрим следующую диаграмму.
На этом изображении показан поток выполнения программы, основанной на Zend Framework. Давайте рассмотрим, что же происходит, когда пользователь запрашивает страницу.
- Скрипт запускает Zend_Controller_Front.
- Вызывается объект Router (маршрутизатор) для построения объекта Zend_Controller_Dispatcher_Token, который содержит информацию о контроллере, действии и параметрах. Перед запуском процесса маршрутизации будет вызван метод плагинов routeStartup() для уведомления о начале работы маршрутизатора. Метод плагинов routeShutdown() вызывается для уведомления об окончании работы маршрутизатора. В этом методе можно подменить объект Zend_Controller_Dispatcher_Token, который возвращается маршрутизатором.
- Метод плагинов dispatchLoopStartup() вызывается для уведомления о начале работы цикла обработки.
- Запускается цикл обработки (Dispatch loop). Zend_Controller_Dispatcher вызывается до тех пор, пока не будут последовательно обработаны все действия (actions). Это означает, что Вы можете построить цепочку действий для выполнения нескольких операций (например, аутентификация пользователя и перенаправление потока выполнения на личную страничку пользователя без обращения к браузеру.) Перед каждой итерацией вызывается метод плагинов preDispatch(), после каждой - postDispatch() для уведомления об очередной итерации обработки.
- В каждой итерации Zend_Controller_Dispatcher инстанцирует объект Zend_Controller_Action и вызывает его метод run().
- Объект Zend_Controller_Action вызывает метод, соответствующий действию в объекте Zend_Controller_Dispatcher_Token. В этом классе объявлен защищенный метод _forward(), который можно использовать для установки следующего действия для выполнения без обращения к браузеру (в этом случае цикл обработки будет повторяться для нового действия).
- Метод dispatchLoopShutdown() плагинов вызывается для уведомления об окончании цикла обработки.
Все уведомления плагинам выполняются через Zend_Controller_Plugin_Broker, который поддерживает список плагинов. Этот класс всего лишь перенаправляет все уведомления каждому плагину в списке.
Для примера предположим, что пользователь запросил следующий URL: http://somehost.com/products/save/id/10. После сохранения товара с id=10 в базе данных, необходимо отобразить сообщение “Товар сохранен в базе данных”. Окно с сообщением реализовано в методе showMessageAction() класса MessagesController. В этом случае поток выполнения будет следующим:
- Скрипт запускает Zend_Controller_Front.
- Маршрутизатор (Router) разбирает URL и извлекает следующую информацию:
- controller - products
- action - save
- params - id = 10
Основываясь на этих данных, он строит Zend_Controller_Dispatcher_Token.
- Запускается цикл обработки. Метод dispatch() объекта Zend_Controller_Dispatcher вызывается для Zend_Controller_Dispatcher_Token, построенного на предыдущем шаге.
- Обработчик (Dispatcher) инстанцирует объект ProductsController и вызывает его метод run(). В этом методе вызывается другой метод того же класса - saveAction().
- Метод saveAction() сохраняет товар в базе данных. Далее он вызывает метод _forward() следующим образом: $this->forward(”messages”, “showMessage”, array(”msg” => “Товар сохранен в базе данных”));.
- Цикл обработки не завершен, так как поток перенаправлен на другое действие. Zend_Controller_Dispatcher вызывает для нового действия.
- showMessageAction не требует перенаправления потока выполнения на другое действие, потому поток завершается.
Для получения более детальной информации обратитесь к официальному руководству.
Русский
English
Дмитро, приветствую!
Все ковыряюсь с ZF…
Не подскажите как реализовать такую казалось бы простую вещь, как перехват управления? В данном контексте подразумевается показ формы ввода пароля при любом (!) экшене в любом контроллере. Если данные в форму введены правильно, то возвращаемся обратно в контроллер/экшн, откуда было инициировано событие. Я догадываюсь, что нужно что-то сделать на уровне Front Controller, но не соображу что и как.
Заранее большое спасибо!
Все дороги ведут к Ruby on Rails. Даже Zend Framework
[...] Dmytro Shteflyuk hat in seinem Blog einen Artikel über die Funktionsweise von Zend_Controller veröffentlicht. Dabei geht er auch darauf ein, wann die verschiedenen Einstiegspunkte für die Plugins aufgerufen werden. Der Artikel ist auch so recht interessant. [...]
Одного понять не могу а как мне сделать такую штуку:
Как сделать когда на страничке только одна форма понятно, а как делать сложные странички с большим количеством данных и т.д.
У меня на страниче к примеру есть кроме формочки с редактированием продукта отображение последних новостей и количество пользователей online. И показывается это на всех страницах сайта.
Так мне что во все контроллеры нужно вставлять выборку данных и отображение их в шаблоне.
Подскажите может я не понял какой-то очень умной идеи при помощи которой решаются все проблемы.
Самое простое - определить базовый класс для всех своих action, который является потомком Zend_Controller_Action. В логике его инициализации можно сделать выборку из базы и заполнение переменных шаблона.
Странно но я так и не смог понять в чем фишка Zend Framework. Я убил два дня на его изучение и так и не пришел к выводу мешает мне этот Framework работать или нет. К концу второго дня я склоняюсь к мысли что больше мешает.
На мой взгляд основная цель Framework-а это некая организация кода,а не захломление его невообразимым числом классов.
Может кто видел какой-нить нормально сделаный пусть и не очень сложный проектик на Zend Framework. Оч хочется посмотреть как люди его вообще используют этот Zend Framework? С чем его предполагалось есть? (2-е формочки обработать как в tutorial я и без крутых ОО Framework-ов могу, а дальше то что…)
Никак не могу поверить что вроде умные люди написали столько совершенно бесполезного кода.
Greetings Dmytro, why you say about the Zend Framework its a confused framework. Right now, I found the best choise to use this framework with smarty. Do you recommend any other framework to PHP ?…
I’m try sinfony and cakephp.. but its to complicated to use with smarty… pls.. recommend me any other framework (MVC) can I use.
The PEAR its cool framework, but its not a MVC arquitecture.
Оч хочется посмотреть как другие вообще используют этот Zend Framework? я так и не смог понять в чем фишка ZF..
[...] Etwas tiefere technische Beschreibung des Ablaufs (englisch) 06.01.2008 [...]
2Sergey:
смысл в том, что вся работа системы структурирована
module->controller->action
т.е. разработка всех приложений сводится к минимальным затратам на обработку запросов - это все… запросы - это URI вызываемого скрипта
все остальное - это собственные классы и шаблоны, которые подчитываются/отображаются при заходах на определенные страницы. как ты сам говоришь, могут быть общие компоненты, которые можно регистрировать с помощью плагинов
на базе ZF удобно создавать собственные фреймворки для сайтов, или даже CMS