如果操作不存在,则Zend重定向到控制器

时间:2014-08-11 08:01:27

标签: php zend-framework

例如,我有行动example.com/books/list

但我犯了错误并写了example.com/books/lists,行动lists不存在,如果行动不存在,如何重定向到controller/index

要在开始行动之前进行检查我可以使用 preDispatch(),但是如何检查这个操作是否存在?

3 个答案:

答案 0 :(得分:3)

自定义错误控制器,使其重定向到404页面或执行您想要的行为。

答案 1 :(得分:1)

你可以试试这段代码吗

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

答案 2 :(得分:1)

这是一个检查操作是否存在的函数。它采用参数Zend_Controller_Request_Abstract并返回boolean

private function _actionExists($request) { 
            $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher(); 

            // Check controller 
            if (!$dispatcher->isDispatchable($request)) { 
                    return false; 
            } 

            // Check action 
            $controllerClassName = $dispatcher->formatControllerName( $request->getControllerName() ); 
            $controllerClassFile = $controllerClassName . '.php'; 
            if ($request->getModuleName() != $dispatcher->getDefaultModule()) { 
                    $controllerClassName = ucfirst($request->getModuleName()) . '_' . $controllerClassName; 
            } 
            try { 
                    require_once 'Zend/Loader.php'; 
                    Zend_Loader::loadFile($controllerClassFile, $dispatcher->getControllerDirectory($request->getModuleName())); 
                    $actionMethodName = $dispatcher->formatActionName($request->getActionName()); 
                    if (in_array($actionMethodName, get_class_methods($controllerClassName))) { 
                            return true; 
                    } 
                    return false; 
            } catch(Exception $e) { 
                    return false; 
            } 
    }

请查看此link了解详情。

然后如果动作实际上不存在(函数返回false),则重定向到索引路径:

$this->_helper->redirector($action, $controller, $module);

编辑:

AS @ MuhannadA.Alhariri和@php-dev分别在他们的回答和评论中声明,这也可以通过自定义ErrorController来处理,我们只需将error_handler与{{1}进行比较}}。这是一个post,它提供了一个自定义的错误控制器。

希望这有帮助。