例如,我有行动example.com/books/list
但我犯了错误并写了example.com/books/lists
,行动lists
不存在,如果行动不存在,如何重定向到controller/index
。
要在开始行动之前进行检查我可以使用 preDispatch(),但是如何检查这个操作是否存在?
答案 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,它提供了一个自定义的错误控制器。
希望这有帮助。