Перенаправление в плагин Front Controller Zend
Я пытаюсь централизовать перенаправления (на основе аутентификации и других состояний) в плагин переднего контроллера. До сих пор я пробовал:
$this->setRequest(new Zend_Controller_Request_Http('my_url'));
в разных точках плагина (т.е. от routeStartup до dispatchLoopShutdown), а также:
$this->setResponse(new Zend_Controller_Response_Http('my_url'));
Может кто-нибудь предложить какую-либо помощь по этому поводу или указать мне в сторону учебника?
Ответы
Ответ 1
Если вы хотите перенаправить, если пользователь не зарегистрирован, первый параметр 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
Самый простой способ - использовать 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.
Внутри ActionGelper использует API-интерфейс Response и Router для выполнения перенаправления, поэтому вы также можете использовать их методы напрямую, например.
$request->setModuleName('someModule')
->setControllerName('someController')
->setActionName('someAction');
или
$response->setRedirect('/some/url', 200);
Дальнейшее чтение:
Ответ 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()
Спасибо!
:)