为什么这段代码会在动作助手preDispatch()函数或插件preDispatch()函数中超时或无效?
$request =$this->getActionController->getRequest();
$request->setModuleName('default');
$request->setControllerName('auth');
$request->setActionName('login');
$request->setDispatched(false);
我正在尝试实现Zend_Acl重定向\ forward,以便将guest用户发送到登录提示符。一切正常,直到我们到达这个特定的代码片段,然后它超时。我在关于实现Zend_Auth和Zend_Acl的书“Zend Frameworks in Action”中关注了@RobAllens的例子。问题出在这个代码片段上。我已经在动作助手类和插件类上尝试了同样的超时错误。它在action method()上工作正常。
答案 0 :(得分:1)
因为您正在设置setDispatched(false)
,(我认为)将为您的登录方法重新初始化操作助手,因此您的ACL检查将再次运行。由于条件将再次失败,ZF将再次执行内部重定向到登录方法,并且该过程重复(因此无限循环)。最简单的解决方法是添加一个附加条件,以便不对登录方法本身运行检查:
if (!$this->_acl->isAllowed($role, $resource, $priv) && $request->getActionName() != 'login') {
[...]
}
如果这不起作用,请查看注释掉setDispatched检查是否有任何区别。