我正在尝试将重定向(基于身份验证和其他各种状态)集中到前端控制器插件中。到目前为止,我已经尝试过:
$this->setRequest(new Zend_Controller_Request_Http('my_url'));
在插件的各个点(即从routeStartup到dispatchLoopShutdown)以及:
$this->setResponse(new Zend_Controller_Response_Http('my_url'));
任何人都可以提供一些帮助,或指向我的教程方向?
答案 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仅关注通过多种方法重定向,例如gotoRoute
,gotoUrl
,gotoSimple
,您可以根据所需的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()函数中的参数
谢谢! :)