Zend Controller在init()方法中重定向

时间:2013-12-31 10:10:42

标签: php zend-framework redirect

class IndexController extends Zend_Controller_Action{
    public function init(){
        if(!isset($_SESSION['administrator'])){
            $this->_helper->redirector->gotoRouteAndExit(array('controller' => 'index', 'module' => 'cp', 'action' => 'login'), null,!0,!0);
        }
    }
}

我试过Firefox,它告诉我:

Firefox检测到服务器正在以永远无法完成的方式重定向此地址的请求。

但是当我将重定向器放在init()方法之外时,它可以工作。

public function indexAction(){
    if(!isset($_SESSION['administrator'])){
        $this->_helper->redirector->gotoRouteAndExit(array('controller' => 'index', 'module' => 'cp', 'action' => 'login'), null,!0,!0);
    }
}

任何人都可以帮助我吗?

修改

我不想重复“重定向代码”,因为在同一个控制器中还需要检查许多其他操作。

2 个答案:

答案 0 :(得分:2)

问题是,在index/login上,您还运行init()方法,检测到该用户不是管理员,并尝试再次将他重定向到index/login,这将再次运行init()方法,检测到他仍然不是管理员......依此类推。因此无限重定向循环。

因此,在您的init()中,您可以先检查是否要尝试拨打login操作,否则,请检查管理员权限并重定向到index/login

在具体案例中,您可能希望更改init()方法,如下所示:

public function init(){
    if ($this->getRequest()->getActionName() !== 'login' && !isset($_SESSION['administrator'])){
        $this->_helper->redirector->gotoRouteAndExit(array('controller' => 'index', 'module' => 'cp', 'action' => 'login'), null,!0,!0);
    }
}

这排除了检查管理员权限和重定向的login操作,打破了无限重定向循环。

答案 1 :(得分:1)

问题是,init()函数将始终在任何控制器中运行,

所以当你进行重定向是init()时,它必须重定向到自身,这将在你的情况下创建无限循环,所以它将保持重定向到自身,如“BluePsyduck”建议。

您可以使用已完成的备用内容并将其重定向到控制器的index Action中。