Zend Framework 2: как разместить перенаправление в модуль, прежде чем приложение достигнет контроллера
Скажем, у нас есть модуль с именем "Корзина" и мы хотим перенаправить пользователей, если какое-то условие выполнено.
Я хочу разместить перенаправление на этапе начальной загрузки модуля, прежде чем приложение достигнет любого контроллера.
Итак, вот код модуля:
<?php
namespace Cart;
class Module
{
function onBootstrap() {
if (somethingIsTrue()) {
// redirect
}
}
}
?>
Я хотел использовать плагин контроллера Url, но, похоже, экземпляр контроллера недоступен на этом этапе, по крайней мере, я не знаю, как его получить.
Заранее спасибо
Ответы
Ответ 1
Это должно выполнить необходимую работу:
<?php
namespace Cart;
use Zend\Mvc\MvcEvent;
class Module
{
function onBootstrap(MvcEvent $e) {
if (somethingIsTrue()) {
// Assuming your login route has a name 'login', this will do the assembly
// (you can also use directly $url=/path/to/login)
$url = $e->getRouter()->assemble(array(), array('name' => 'login'));
$response=$e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
$response->sendHeaders();
// When an MvcEvent Listener returns a Response object,
// It automatically short-circuit the Application running
// -> true only for Route Event propagation see Zend\Mvc\Application::run
// To avoid additional processing
// we can attach a listener for Event Route with a high priority
$stopCallBack = function($event) use ($response){
$event->stopPropagation();
return $response;
};
//Attach the "break" as a listener with a high priority
$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, $stopCallBack,-10000);
return $response;
}
}
}
?>
Ответ 2
Конечно, это дает вам ошибку, потому что вы должны присоединить слушателя к событию. В следующем примере я использую SharedManager, и я присоединяю слушателя к AbstractActionController
.
Конечно, вы можете прикрепить своего слушателя к другому событию. Ниже приведен только рабочий пример, показывающий, как он работает. Для получения дополнительной информации посетите http://framework.zend.com/manual/2.1/en/modules/zend.event-manager.event-manager.html.
public function onBootstrap($e)
{
$e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
$controller = $e->getTarget();
if (something.....) {
$controller->plugin('redirect')->toRoute('yourroute');
}
}, 100);
}
Ответ 3
Страница неправильно перенаправляется при ошибке
public function onBootstrap($e) {
$e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
if(someCondition==true) {
$controller->plugin('redirect')->toRoute('myroute');
}
}
Ответ 4
Можете ли вы попробовать это.
$front = Zend_Controller_Front::getInstance();
$response = new Zend_Controller_Response_Http();
$response->setRedirect('/profile');
$front->setResponse($response);