Обновлено: лучшие практики для управления статическим контентом в Zend Framework? - PullRequest
7 голосов
/ 20 января 2012

У меня есть несколько вопросов, касающихся 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 для очистки ввода или это просто перебор?

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Я думаю, что вы на правильном пути, но вот некоторые другие идеи.

Разбейте вашу маршрутизацию по разделам в вашем 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

Некоторые ссылки, которые могут помочь:

  • codeutopia.net / блог / 2007/11/16 / маршрутизации-и-комплекс-URLs-в-Зенд-основа /
  • www.vayanis.com / 2009/03/20 / интро к Зенд-каркасы маршрутизации /
1 голос
/ 22 января 2012

Ваш подход кажется мне разумным. Однако, возможно, вам следует использовать вместо этого метод __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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...