Как получить перенаправление 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( );
}
}
}
Я не могу проверить это, хотя мысль должна быть ясной.