Как получить перенаправление Zend_Controller_Plugin_Abstract, работающее с полным изменением URL?

У меня есть администратор webapp.one нужно войти перед выполнением любого действия. Теперь /default/index/index имеет форму входа, которая является компонентом ExtJs. В основном процесс входа в систему является ajax-одним. Я создал плагин для отключения рендеринг и макет и проверить, вошел ли пользователь в систему или нет (пока нет полного acl).

вот код:

 public function  preDispatch(Zend_Controller_Request_Abstract $request) {
    parent::preDispatch($request);

    if($request->isXmlHttpRequest()){
        $ViewHelper = Zend_Controller_Action_HelperBroker::getStaticHelper("ViewRenderer");
        $ViewHelper->setNoRender(true);
        Zend_Layout::getMvcInstance()->disableLayout();

    }


    $module = $request->getModuleName();
    $controller = $request->getControllerName();
    $action = $request->getActionName();

    if(!Zend_Auth::getInstance()->hasIdentity()){
        $url = "/".$module."/".$controller."/".$action;
          $session = new Zend_Session_Namespace("myapp.auth");
        $session->requestURL = $url;
        $request->setModuleName("default");
        $request->setControllerName("index");
        $request->setActionName("index");
        $request->setDispatched();

    }
}

это похоже на работу, но тогда адресная строка все еще имеет исходный URL-адрес запроса. например я набрал "myapp/admin/cpanel" в строке URL, и он открывает страницу входа в браузере, пока адресная строка еще "myapp/admin/cpanel".в тот момент, когда вход в систему не удается, потому что вывод имеет некоторые рендеринга html, я считаю, со страницы входа в систему (которая работала нормально при прямом попадании).

Кто-нибудь сталкивался с этим раньше или просто я что-то делаю не так? Я буду рад, если вы поделитесь этим с этим.

спасибо, что прочитали это.

1 ответ

Решение

это похоже на работу, но тогда адресная строка все еще имеет исходный URL-адрес запроса. например, я набрал "myapp/admin/cpanel" в строке URL-адреса, и он открывает страницу входа в браузере, в то время как в адресной строке все еще есть "myapp/admin/cpanel".

Если вам не нравится это поведение, вы можете рассмотреть возможность перенаправления пользователя в форму входа вместо обработки входа перед каждым контроллером. Если ваша страница логина действительно доступна в данный момент, это должно быть так же просто, как написать:

<?php
public function  preDispatch(Zend_Controller_Request_Abstract $request) {
    parent::preDispatch($request);

    if($request->isXmlHttpRequest()){
        $ViewHelper = Zend_Controller_Action_HelperBroker::getStaticHelper("ViewRenderer");
        $ViewHelper->setNoRender(true);
        Zend_Layout::getMvcInstance()->disableLayout();
    }

    $module = strtolower( $request->getModuleName( ) );
    $controller = strtolower( $request->getControllerName( ) );
    $action = strtolower( $request->getActionName( ) );

    /** Check to see if the controller is already the login controller to prevent an endless loop. */
    //corrected if(!array( 'default', 'index', 'index' ) === array()) to if(array( 'default', 'index', 'index' ) !== array())
    if( ( array( 'default', 'index', 'index' ) !== array( $module, $controller, $action ) ) {

        if( !Zend_Auth::getInstance()->hasIdentity( ) ) {
            $url = "/".$module."/".$controller."/".$action;
              $session = new Zend_Session_Namespace("myapp.auth");
            $session->requestURL = $url;
            $this->getResponse()->setRedirect( '/' )->sendResponse( );
        }
    }
}

Я не могу проверить это, хотя мысль должна быть ясной.

Другие вопросы по тегам