在Front Controller插件中重定向Zend

时间:2010-03-01 17:33:32

标签: zend-framework redirect plugins request response

我正在尝试将重定向(基于身份验证和其他各种状态)集中到前端控制器插件中。到目前为止,我已经尝试过:

    $this->setRequest(new Zend_Controller_Request_Http('my_url'));

在插件的各个点(即从routeStartup到dispatchLoopShutdown)以及:

    $this->setResponse(new Zend_Controller_Response_Http('my_url'));

任何人都可以提供一些帮助,或指向我的教程方向?

3 个答案:

答案 0 :(得分:29)

最简单的方法是使用ZF的Redirect ActionHelper

    $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    $r->gotoUrl('/some/url')->redirectAndExit();

或者在没有HelperBroker

的情况下实例化它
    $r = new Zend_Controller_Action_Helper_Redirector;
    $r->gotoUrl('/some/url')->redirectAndExit();

ActionHelper提供的API仅关注通过多种方法重定向,例如gotoRoutegotoUrlgotoSimple,您可以根据所需的UseCase使用这些方法。

在内部,ActionHelper使用Response和Router的API来进行重定向,因此您也可以直接使用他们的方法,例如。

    $request->setModuleName('someModule')
            ->setControllerName('someController')
            ->setActionName('someAction');

    $response->setRedirect('/some/url', 200);

进一步阅读:

答案 1 :(得分:23)

如果您希望重定向用户未登录,则dispatchLoopStartup()的第一个参数是请求对象的句柄。

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
        $request->setControllerName('auth');
        $request->setActionName('login');
        // Set the module if you need to as well.
    }
}

答案 2 :(得分:3)

如果你想在索引页面中重定向,那么这就足够了。

public function preDispatch(Zend_Controller_Request_Abstract $request)
{
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
          $baseUrl = new Zend_View_Helper_BaseUrl();
          $this->getResponse()->setRedirect($baseUrl->baseUrl());
    }
}

如果你想在其他地方重定向,那么只需更改setRedirect()函数中的参数

谢谢! :)