Intereting Posts
ТВ-руководство, написанное на PHP – проблемы с функциями datetime () и базы данных Как получить параметры компонента? Перенаправление с использованием PHP, а не перенаправление в Cpanel Как отправить значение на страницу с несколькими php? Проверка PageRank через XML Использование PHP для вызова веб-службы WCF с несколькими привязками Получение переменной с помощью команды PHP $ _GET Поиск рекурсивного массива php – возврат определенного родителя Как заполнить список динамических навигационных меню, следуя моим структурам таблиц, используя php (codeigniter) и mysql Переписывать url, чтобы скрыть index.php и сделать запрос приятным Как я могу определить, была ли строка вставлена ​​в базу данных за несколько секунд назад читать содержимое PST-файла с помощью php Как получить идентификатор заказа в woocommerce_email_headers Манипуляции строк и регулярных выражений Могу ли я установить Composer в выбранный снимок или только в «официальной» версии

Zend Framework 2: как разместить перенаправление в модуль, прежде чем приложение достигнет контроллера

Допустим, у нас есть модуль с именем Cart и мы хотим перенаправить пользователей, если какое-то условие выполнено. Я хочу разместить перенаправление на этапе начальной загрузки модуля, прежде чем приложение достигнет любого контроллера.

Итак, вот код модуля:

<?php namespace Cart; class Module { function onBootstrap() { if (somethingIsTrue()) { // redirect } } } ?> 

Я хотел использовать плагин контроллера Url, но, похоже, экземпляр контроллера недоступен на этом этапе, по крайней мере, я не знаю, как его получить.

заранее спасибо

Это должно сделать необходимую работу:

 <?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; } } } ?> 

Конечно, это дает вам ошибку, потому что вы должны присоединить слушателя к событию. В следующем примере я использую 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); } 

Страница не перенаправляется должным образом при ошибке

 public function onBootstrap($e) { $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { if(someCondition==true) { $controller->plugin('redirect')->toRoute('myroute'); } } 

Можете ли вы попробовать это.

 $front = Zend_Controller_Front::getInstance(); $response = new Zend_Controller_Response_Http(); $response->setRedirect('/profile'); $front->setResponse($response);