У меня есть некоторые вопросы относительно Zend Framework. Я displayAction()
маршрутизировать все статические страницы через контроллер по умолчанию, используя теперь метод displayAction()
умолчанию. Намерение состоит в том, чтобы displayAction()
обрабатывал запрос, просматривая параметр page
, определяя, существует ли страница сценария, если она визуализирует представление, в противном случае выбрасывает ошибку 404 страницы. Кроме того, выполняется проверка, чтобы проверить, существует ли метод с тем же именем, что и параметр, если это так, вызовите это действие.
Здесь перечислены настройки маршрутизации из приложения application.ini
resources.router.routes.static-pages.route = /:page resources.router.routes.static-pages.defaults.module = default resources.router.routes.static-pages.defaults.controller = index resources.router.routes.static-pages.defaults.action = display
Вот действия контроллера:
public function someAction() { // do something } public function displayAction() { // extract page param, eg 'some' $page = $this->getRequest()->getParam('page'); // create zend styled action method, eg 'someAction' $page_action = $page.'Action'; // if a method within this controller exists, call on it if (method_exists($this, $page_action)) { $this->$page_action(); } // if nothing was passed in page param, set to 'home' if (empty($page)) { $page = 'home'; } // if script exists, render, otherwise, throw exception. if (file_exists($this->view->getScriptPath(null)."/".$this->getRequest()->getControllerName()."/$page.".$this->viewSuffix)) { $this->render($page); } else { throw new Zend_Controller_Action_Exception('Page not found', 404); } }
Теперь, вот мои вопросы: есть ли лучший способ сделать это? Я относительно новичок в этой структуре, поэтому есть ли лучшие практики, которые применяются? Есть ли лучший способ вызвать действие из контроллера? Я проделал много работы по документации, однако, это немного противоречит самому себе.
Обновление 1:
После того, как я подумал и прочитал, мне удалось упростить решение и включить в него несколько вещей. ПРИМЕЧАНИЕ. Я использую PagesController
как мой статический контроллер контента по умолчанию.
Здесь перечислены настройки маршрутизации из application.ini. Для звонков на домашнюю страницу, т.е. «/», я передаю «home» в качестве параметра action
, для всех других запросов параметр user defined / url link отправляется в action
.
resources.router.routes.home.route = "/" resources.router.routes.home.defaults.module = "default" resources.router.routes.home.defaults.controller = "pages" resources.router.routes.home.defaults.action = "home" resources.router.routes.pages.route = "/:action" resources.router.routes.pages.defaults.module = "default" resources.router.routes.pages.defaults.controller = "pages"
Вот действия контроллера. Если пользователь определяет параметр как действие, он будет вызываться, иначе он попадает в магическую функцию php __call.
public function someAction() { // Do something } public function __call($method, $args) { // extract action param, eg "home" $page = $title = $this->getRequest()->getParam('action'); // test if script exists if (file_exists($this->view->getScriptPath(null) . "/" . $this->getRequest()->getControllerName() . "/$page . " . $this->viewSuffix)) { // pass title to layout $this->view->assign(compact('title')); // render script $this->render($page); } else { throw new Zend_Controller_Action_Exception('Page not found', 404); } }
Оно работает. Итак, вот мои вопросы: рассмотрели бы стандартизацию использования этого метода для управления статическим контентом? Если нет, почему бы и нет? Как бы вы его улучшили? Кроме того, учитывая, что это запрос GET, было бы разумным переходом использовать Zend_Filter_input для очистки ввода или это просто избыток?
Ваш подход кажется мне разумным. Однако, возможно, вы должны использовать вместо этого метод __call
, который позволит вам более легко направлять ваши действия …
Настройте свой маршрут следующим образом:
resources.router.routes.static-pages.route = /:action resources.router.routes.static-pages.defaults.module = default resources.router.routes.static-pages.defaults.controller = index
И ваш контроллер:
public function someAction() { //going to URL /some will now go into this method } public function __call($name, $args) { //all URLs which don't have a matching action method will go to this one }
Я думаю, что вы на правильном пути, но вот некоторые другие идеи.
Разбивайте свою маршрутизацию по разделам вашего INI: т. Е. Блог-маршрутизатор, статический маршрутизатор страниц и форум-роутер и т. Д. (Я думаю, вы уже это делаете)
Используйте различные классы маршрутизаторов для обработки маршрутизации в каждом разделе, а не для отправки на контроллер.
Статический: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.static
Все: http://framework.zend.com/manual/en/zend.controller.router.html
Некоторые ссылки, которые могут помочь: