Пользовательский маршрут Zend не распознается для контроллера - PullRequest
2 голосов
/ 24 июля 2011

Я создаю контроллер, который будет извлекать информацию о художнике из базы данных и отображать ее: PainterController.Я определил это так:

<?php
class PainterController extends Zend_Controller_Action
{

    public function init()
    {
        //setup painter route
        $router = $this->getFrontController()->getRouter();
        $router->addRoute(
            'painter',
            new Zend_Controller_Router_Route(
                'painter/:id',
                array(
                    'controller' => 'painter',
                    'action' => 'info'
                )
            )
        );
    }

    public function indexAction()
    {
        //index
    }

    public function infoAction()
    {
        //info was requested for given ID
    }
}
?>

Как видите, маршрут настроен так, чтобы принимать что-то вроде domain.com/painter/12, где в этом примере id 12 передается в infoAction.

Тем не менее, когда я посещаю такой URL, маршрут не распознается, вместо этого я получаю:

Message: Action "2" does not exist and was not trapped in __call()

Stack trace:

#0 /home/httpd/vhosts/xxx.com/subdomains/peter/httpdocs/library/Zend/Controller/Action.php(515): Zend_Controller_Action->__call('2Action', Array)
#1 /home/httpd/vhosts/xxx.com/subdomains/peter/httpdocs/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('2Action')
#2 /home/httpd/vhosts/xxx.com/subdomains/peter/httpdocs/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#3 /home/httpd/vhosts/xxx.com/subdomains/peter/httpdocs/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
#4 /home/httpd/vhosts/xxx.com/subdomains/peter/httpdocs/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#5 /home/httpd/vhosts/xxx.com/subdomains/peter/httpdocs/public/index.php(25): Zend_Application->run()
#6 {main}  
Request Parameters:

array (
      'controller' => 'painter',
  'action' => '2',
  'module' => 'default',
)  

Кто-нибудь знает, почему это произойдет?

(К вашему сведению, я понимаю, что файлы находятся в общедоступном каталоге, это связано с ограничением общего веб-хоста. Файлы защищены с помощью .htaccess. Это не связано с вопросом.)

Обновление: кажется, что выше работает, когда определено в начальной загрузке.Тем не менее, я не люблю помещать много логики в начальной загрузке.Можно ли определить маршруты, связанные с контроллером, внутри самого контроллера?

1 Ответ

5 голосов
/ 24 июля 2011

Можно ли определить маршруты, связанные с контроллером, внутри самого контроллера?

Нет.Маршрутизатор отвечает за поиск действий контроллера, которые необходимо открыть.Вы должны добавить все свои пользовательские маршруты, прежде чем маршрутизатор попросит направить запрос.Это происходит в методе dispatch на передней панели.

Помимо файла начальной загрузки, вы можете добавить свои маршруты к application.ini или другим файлам конфигурации маршрутизатора .

Также вы можете добавлять маршруты через пользовательский плагин.Если вы собираетесь использовать плагин.Вы должны добавить к routeStartup метод, потому что это происходит непосредственно перед тем, как маршрутизатор направит запрос.

...