11

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

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

在插件的各个点(即从 routeStartup 到 dispatchLoopShutdown),还有:

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

任何人都可以在这方面提供一些帮助,或者指出我的教程方向吗?

4

3 回答 3

31

最简单的方法是使用 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,仅关注通过多种方法进行重定向,例如gotoRoute, gotoUrl, gotoSimple,您可以根据所需的 UseCase 使用这些方法。

在内部,ActionHelper 使用 Response 和 Router 的 API 来做重定向,所以你也可以直接使用它们的方法,例如

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

或者

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

进一步阅读:

于 2010-03-01T18:15:06.960 回答
24

如果您希望在用户未登录的情况下进行重定向,则 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.
    }
}
于 2010-03-01T18:09:34.557 回答
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() 函数中的参数

谢谢!:)

于 2011-09-21T15:51:38.310 回答