Как проверить, существует ли действие в preDispatch плагина контроллера

У меня есть два модуля (по умолчанию и мобильный), модуль mobile - это перезапись портала по умолчанию в jquery mobile, но с гораздо меньшим количеством контроллеров и действий! Я подумал написать плагин контроллера, который проверял бы, существуют ли контроллер и действие в модуле mobile, если нет, я бы хотел перезаписать модуль mobile по умолчанию. Я пытаюсь это:

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
    $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
    if ($request->getModuleName() == 'mobile') {      
        if (!$dispatcher->isDispatchable($request)) {
            // Controller or action not exists
            $request->setModuleName('default');
        }
    }
    return $request;
}

но $dispatcher->isDispatchable($request) вернись всегда true хотя действия не существуют!:S и я получаю "Действие foo не существует и не был пойман в __call()"

Как я могу сделать? Спасибо

2 ответа

Задумывались ли вы, как проверить, есть ли контроллер / действие в Zend FM с любой стороны приложения? Вот код

    $front = Zend_Controller_Front::getInstance();
    $dispatcher = $front->getDispatcher();

    $test = new Zend_Controller_Request_Http();
    $test->setParams(array(
        'action' => 'index',
        'controller' => 'content',

            )
    );

    if($dispatcher->isDispatchable($test)) {
        echo "yes-its a controller";
        //$this->_forward('about-us', 'content'); // Do whatever you want
    } else {
        echo "NO- its not a Controller";
    }

РЕДАКТИРОВАТЬ

Проверьте как этот путь

$classMethods = get_class_methods($className);
 if(!in_array("__call", $classMethods) &&
 !in_array($this->getActionMethod($request), $classMethods))
 return false;

а также, пожалуйста, смотрите подробную ссылку

Я бы посоветовал вам сделать статические или динамические маршруты либо через менеджер ресурсов конфигурации, загрузчик или через плагин фронт-контроллера:

Пример определения статических маршрутов в Bootstrap.php:

public function _initRoutes()
{
    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter(); // default Zend MVC routing will be preserved

    // create first route that will point from nonexistent action in mobile module to existing action in default module
    $route = new Zend_Controller_Router_Route_Static(
        'mobile/some-controller/some-action', // specify url to controller and action that dont exist in "mobile" module
        array(
            'module' => 'default', // redirect to "default" module
            'controller' => 'some-controller',
            'action' => 'some-action', // this action exists in "some-controller" in "default" module
        )
    );
    $router->addRoute('mobile-redirect-1', $route); // first param is the name of route, not url, this allows you to override existing routes like default route

    // repeat process for another route
}

Это эффективно перенаправит запрос для / mobile / some-controller / some-action на / default / some-controller / some-action

some-controller и some-action должны быть заменены правильными именами контроллера и действия.

Я использовал статическую маршрутизацию, которая подходит для точных URL-адресов, но так как большинство приложений используют дополнительные параметры в URL-адресе для действий контроллера, лучше использовать динамические маршруты.
В приведенном выше примере просто измените класс создания маршрута на Zend_Controller_Router_Route и маршрут URL до "mobile/some-controller/some-action/*" и каждый запрос будет маршрутизироваться динамически, как в примере:

/mobile/some-contoller/some-action/param1/55/param2/66 
will point to 
/default/some-controller/some-action/param1/55/param2/66

Для получения дополнительной информации о маршрутизации в ZF1 проверьте эту ссылку

Другие вопросы по тегам