Zend framework Zend_Acl和重定向\转发

Zend framework Zend_Acl和重定向\转发,zend-framework,zend-acl,Zend Framework,Zend Acl,这段代码在动作助手preDispatch()函数或插件preDispatch()函数中超时或不起作用,有什么原因吗 $request =$this->getActionController->getRequest(); $request->setModuleName('default'); $request->setControllerName('auth'); $request->setActionName('login'); $request->setDi

这段代码在动作助手preDispatch()函数或插件preDispatch()函数中超时或不起作用,有什么原因吗

$request =$this->getActionController->getRequest();
$request->setModuleName('default');
$request->setControllerName('auth');
$request->setActionName('login');
$request->setDispatched(false);

我正在尝试实现Zend_Acl重定向\转发,以便将来宾用户发送到登录提示。一切正常,直到我们找到这个特定的代码片段,然后它超时。我在他的书《Zend框架在行动》中以@RobAllens为例介绍了Zend_Auth和Zend_Acl的实现。问题就在于这个代码片段。我在动作助手类和插件类上都试过了,但出现了相同的超时错误。它在action method()上运行良好

因为您正在设置
setDispatched(false)
,(我认为)操作助手将为您的登录方法重新初始化,因此您的ACL检查将再次运行。由于该条件将再次失败,ZF将再次对登录方法执行内部重定向,并且该过程将重复(因此是无限循环)。最简单的修复方法是添加一个附加条件,这样就不会对登录方法本身运行检查:

if (!$this->_acl->isAllowed($role, $resource, $priv) && $request->getActionName() != 'login') {
    [...]
}

如果这不起作用,请查看注释掉setDispatched检查是否有任何区别。

Infinite loop?你有什么办法阻止它在登录操作上运行此代码?@TimFountain,我不知道你的目的是什么(我还在学习),但是应该运行此代码段的条件是:“如果(!$this->_acl->isAllowed($role,$resource,$priv)){code snippet}在操作助手上。希望我的答案更清楚一点。