Перенаправление в плагин 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()

Спасибо! :)