Zend Framework 2 redirect() с flashMessenger не работает
У меня есть контроллер с method_1(). В этом методе я вызываю method_2(). В method_2 () у меня есть (try... catch) - блок с определенным flashMesseges и редиректом.
$this->flashMessenger()->addErrorMessage("There are errors.");
return $this->redirect()->toRoute('home');
Но это не работает. Но если я напишу как
$this->redirect()->toRoute('home');
$this->flashMessenger()->addErrorMessage("There are errors.");
Все ок. В коде method_1 ()
$this->flashMessenger()->addErrorMessage("There are errors.");
return $this->redirect()->toRoute('home');
работающий исправно. Я не понимаю Кто-нибудь может мне помочь?
Класс А - редирект не работает. И сообщение добавить в сессию.
class A {
public function manageAction()
{
$view = new ViewModel();
$form = $this->getForm();
$form = $this->fillForm($form);
$view->form = $form;
return $view;
}
public function fillForm($form)
{
try {
// ...
} catch (\Exception $e) {
$this->flashMessenger()->addErrorMessage("Error");
return $this->redirect()->toRoute('home');
}
return $form;
}
}
Класс Б - редирект рабочий. И сообщение напечатано.
class B {
public function manageAction()
{
$view = new ViewModel();
$form = $this->getForm();
$form = $this->fillForm($form);
$view->form = $form;
return $view;
}
public function fillForm($form)
{
try {
// ...
} catch (\Exception $e) {
$this->redirect()->toRoute('home');
$this->flashMessenger()->addErrorMessage("Error");
}
return $form;
}
}
Почему и как это работает?
2 ответа
redirect()
плагин возвращает Response
объект. Вы должны вернуть его в действии.
Обновление: рекомендую переехать
try/catch
к действию.
class A {
public function manageAction()
{
$view = new ViewModel();
$form = $this->getForm();
try {
$this->fillForm($form);
} catch (\Exception $e) {
$this->flashMessenger()->addErrorMessage("Error");
return $this->redirect()->toRoute('home');
}
$view->form = $form;
return $view;
}
public function fillForm($form)
{
// ...
}
}
Плагин FlashMessenger отправляет ваше сообщение в пул ожидания (с помощью плагина FlashMessenger Zend MVC), который будет отображаться при запросе другой страницы (с помощью ViewHelper FlashMessenger) .
Существует 4 типа сообщений, которые вы можете интегрировать с уведомлениями начальной загрузки (ошибка, информация, по умолчанию, успех) .
Теперь давайте потренируемся
В действии в контроллере вы должны ввести свое сообщение и свой бренд:
use Zend\Mvc\Controller\Plugin\FlashMessenger;
public function registerAction(){
if($formValid){
$this->flashMessenger()->addSucessMessage('Saved!');
} else{
$this->flashMessenger()->addErrorMessage('Fail!');
}
//redirect to other route and show message
return $this->redirect()->toRoute('app');
}
В View (.phtml) вам нужно только использовать:
#show messages of addErrorMessage();
echo $flash->render('error', array('alert', 'alert-dismissible', 'alert-danger'));
#show messages of addInfoMessage();
echo $flash->render('info', array('alert', 'alert-dismissible', 'alert-info'));
#show messages of addMessage();
echo $flash->render('default', array('alert', 'alert-dismissible', 'alert-warning'));
#show messages of addSucessMessage();
echo $flash->render('success', array('alert', 'alert-dismissible', 'alert-success'));
В представлении, если используется Bootstrap:
$flash = $this->flashMessenger();
$flash->setMessageOpenFormat('<div>
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">
×
</button>
<ul><li>')
->setMessageSeparatorString('</li><li>')
->setMessageCloseString('</li></ul></div>');
echo $flash->render('error', array('alert', 'alert-dismissible', 'alert-danger'));
echo $flash->render('info', array('alert', 'alert-dismissible', 'alert-info'));
echo $flash->render('default', array('alert', 'alert-dismissible', 'alert-warning'));
echo $flash->render('success', array('alert', 'alert-dismissible', 'alert-success'));
Теперь, если вы хотите просматривать FlashMessages на экране без запроса перенаправления на страницу перенаправления (идеально подходит для ошибок формы, которые вы не перенаправляете, или AJAX на другую страницу), используйте renderCurrent и clear.
echo $ flash-> renderCurrent ('error', array ('alert', 'alert-disptable', 'alert-danger'));
Если вы хотите углубиться в это, перейдите по ссылкам Официальная документация Zend 2, опробует доступные методы, очень поможет:
ПРОСМОТР -> http://framework.zend.com/manual/current/en/modules/zend.view.helpers.flash-messenger.html
КОНТРОЛЛЕР -> http://framework.zend.com/manual/current/en/modules/zend.mvc.plugins.html