У меня есть несколько вопросов, касающихся Zend Framework. Я пытаюсь направить все статические страницы через контроллер по умолчанию, используя метод по умолчанию 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, e.g. 'some'
$page = $this->getRequest()->getParam('page');
// create zend styled action method, e.g. '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
, для всех других запросов пользовательский параметр / 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, e.g. "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 для очистки ввода или это просто перебор?