0

是否有任何原因导致此代码在动作助手 preDispatch() 函数或插件 preDispatch() 函数中超时或不起作用?

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

我正在尝试实现 Zend_Acl 重定向\转发,以便将访客用户发送到登录提示。一切正常,直到我们到达这个特定的代码片段,然后它超时。我在他的“Zend Frameworks in Action”一书中关注@RobAllens 中关于实现 Zend_Auth 和 Zend_Acl 的示例。问题出在这个代码片段上。我已经在动作助手类和插件类上都尝试过它,但存在相同的超时错误。它在动作方法()上运行良好。

4

1 回答 1

1

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

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

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

于 2012-11-06T22:30:37.783 回答