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">
         &times;
     </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

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