Исследуем класс Zend_Controller из Zend Framework

Apr 28
2006 00:19 (Программирование, PHP) · English (18,205 views)

Команда разработчиков Zend Framework с воодушевлением работает над Zend Framework, фреймворком для построения мощных веб-приложений на PHP. Но очень многих смущает его кажущаяся сложность. В этой заметке я попытаюсь объяснить архитектуру наиболее важной части (по моему мнению) фреймворка - Zend_Controller.

Для начала, рассмотрим следующую диаграмму.

Zend_Controller workflow

На этом изображении показан поток выполнения программы, основанной на Zend Framework. Давайте рассмотрим, что же происходит, когда пользователь запрашивает страницу.

  1. Скрипт запускает Zend_Controller_Front.
  2. Вызывается объект Router (маршрутизатор) для построения объекта Zend_Controller_Dispatcher_Token, который содержит информацию о контроллере, действии и параметрах. Перед запуском процесса маршрутизации будет вызван метод плагинов routeStartup() для уведомления о начале работы маршрутизатора. Метод плагинов routeShutdown() вызывается для уведомления об окончании работы маршрутизатора. В этом методе можно подменить объект Zend_Controller_Dispatcher_Token, который возвращается маршрутизатором.
  3. Метод плагинов dispatchLoopStartup() вызывается для уведомления о начале работы цикла обработки.
  4. Запускается цикл обработки (Dispatch loop). Zend_Controller_Dispatcher вызывается до тех пор, пока не будут последовательно обработаны все действия (actions). Это означает, что Вы можете построить цепочку действий для выполнения нескольких операций (например, аутентификация пользователя и перенаправление потока выполнения на личную страничку пользователя без обращения к браузеру.) Перед каждой итерацией вызывается метод плагинов preDispatch(), после каждой - postDispatch() для уведомления об очередной итерации обработки.
  5. В каждой итерации Zend_Controller_Dispatcher инстанцирует объект Zend_Controller_Action и вызывает его метод run().
  6. Объект Zend_Controller_Action вызывает метод, соответствующий действию в объекте Zend_Controller_Dispatcher_Token. В этом классе объявлен защищенный метод _forward(), который можно использовать для установки следующего действия для выполнения без обращения к браузеру (в этом случае цикл обработки будет повторяться для нового действия).
  7. Метод dispatchLoopShutdown() плагинов вызывается для уведомления об окончании цикла обработки.

Все уведомления плагинам выполняются через Zend_Controller_Plugin_Broker, который поддерживает список плагинов. Этот класс всего лишь перенаправляет все уведомления каждому плагину в списке.

Для примера предположим, что пользователь запросил следующий URL: http://somehost.com/products/save/id/10. После сохранения товара с id=10 в базе данных, необходимо отобразить сообщение “Товар сохранен в базе данных”. Окно с сообщением реализовано в методе showMessageAction() класса MessagesController. В этом случае поток выполнения будет следующим:

  1. Скрипт запускает Zend_Controller_Front.
  2. Маршрутизатор (Router) разбирает URL и извлекает следующую информацию:
    • controller - products
    • action - save
    • params - id = 10

    Основываясь на этих данных, он строит Zend_Controller_Dispatcher_Token.

  3. Запускается цикл обработки. Метод dispatch() объекта Zend_Controller_Dispatcher вызывается для Zend_Controller_Dispatcher_Token, построенного на предыдущем шаге.
  4. Обработчик (Dispatcher) инстанцирует объект ProductsController и вызывает его метод run(). В этом методе вызывается другой метод того же класса - saveAction().
  5. Метод saveAction() сохраняет товар в базе данных. Далее он вызывает метод _forward() следующим образом: $this->forward(”messages”, “showMessage”, array(”msg” => “Товар сохранен в базе данных”));.
  6. Цикл обработки не завершен, так как поток перенаправлен на другое действие. Zend_Controller_Dispatcher вызывает для нового действия.
  7. showMessageAction не требует перенаправления потока выполнения на другое действие, потому поток завершается.

Для получения более детальной информации обратитесь к официальному руководству.

10 отзывов на 'Исследуем класс Zend_Controller из Zend Framework'

Подписаться на комментарии по RSS или TrackBack на 'Исследуем класс Zend_Controller из Zend Framework'.

1
Михаил
сказал 14.06.2006 в 9.14

Дмитро, приветствую!

Все ковыряюсь с ZF… :) Не подскажите как реализовать такую казалось бы простую вещь, как перехват управления? В данном контексте подразумевается показ формы ввода пароля при любом (!) экшене в любом контроллере. Если данные в форму введены правильно, то возвращаемся обратно в контроллер/экшн, откуда было инициировано событие. Я догадываюсь, что нужно что-то сделать на уровне Front Controller, но не соображу что и как.

Заранее большое спасибо!

2
Mamut
сказал 09.07.2006 в 12.26

Все дороги ведут к Ruby on Rails. Даже Zend Framework :)

3
сказал 11.10.2006 в 10.34

[...] 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. [...]

4
Sergey
сказал 23.11.2006 в 13.23

Одного понять не могу а как мне сделать такую штуку:
Как сделать когда на страничке только одна форма понятно, а как делать сложные странички с большим количеством данных и т.д.
У меня на страниче к примеру есть кроме формочки с редактированием продукта отображение последних новостей и количество пользователей online. И показывается это на всех страницах сайта.

Так мне что во все контроллеры нужно вставлять выборку данных и отображение их в шаблоне.
Подскажите может я не понял какой-то очень умной идеи при помощи которой решаются все проблемы. :-(

5
сказал 23.11.2006 в 13.38

Самое простое - определить базовый класс для всех своих action, который является потомком Zend_Controller_Action. В логике его инициализации можно сделать выборку из базы и заполнение переменных шаблона.

6
Sergey
сказал 23.11.2006 в 19.43

Странно но я так и не смог понять в чем фишка Zend Framework. Я убил два дня на его изучение и так и не пришел к выводу мешает мне этот Framework работать или нет. К концу второго дня я склоняюсь к мысли что больше мешает.
На мой взгляд основная цель Framework-а это некая организация кода,а не захломление его невообразимым числом классов.

Может кто видел какой-нить нормально сделаный пусть и не очень сложный проектик на Zend Framework. Оч хочется посмотреть как люди его вообще используют этот Zend Framework? С чем его предполагалось есть? (2-е формочки обработать как в tutorial я и без крутых ОО Framework-ов могу, а дальше то что…)
Никак не могу поверить что вроде умные люди написали столько совершенно бесполезного кода.

7
сказал 01.02.2007 в 1.16

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.

8
сказал 03.08.2007 в 12.51

Оч хочется посмотреть как другие вообще используют этот Zend Framework? я так и не смог понять в чем фишка ZF..

9
сказал 07.01.2008 в 14.38

[...] Etwas tiefere technische Beschreibung des Ablaufs (englisch) 06.01.2008 [...]

10
сказал 06.02.2008 в 2.15

2Sergey:
смысл в том, что вся работа системы структурирована
module->controller->action

т.е. разработка всех приложений сводится к минимальным затратам на обработку запросов - это все… запросы - это URI вызываемого скрипта

все остальное - это собственные классы и шаблоны, которые подчитываются/отображаются при заходах на определенные страницы. как ты сам говоришь, могут быть общие компоненты, которые можно регистрировать с помощью плагинов

на базе ZF удобно создавать собственные фреймворки для сайтов, или даже CMS

Оставить отзыв

Вы можете использовать простые теги форматирования HTML (вроде <a>, <ul> and others). Чтобы вставить пример код, используйте <code lang="php">$a = "hello";</code> (поддерживаемые языки: ruby, php, yaml, html, csharp, javascript). Также Вы можете использовать <code>$a = "hello";</code>, синтаксис не будет подсвечен. Если вы не хотите использовать тег <code>, замените символ < на &lt;.

Отправить

 
Copyright © 2005 - 2008, Dmytro Shteflyuk