2

У меня есть контроллер с методом method_1(). В этом методе я вызываю метод_2(). В методе_2() у меня есть (try ... catch) - блок с определенными flashMesseges и перенаправление.Zend Framework 2 перенаправление() с flashMessenger не работает

$this->flashMessenger()->addErrorMessage("There are errors."); 
return $this->redirect()->toRoute('home'); 

Но это не работает. Но если я напишу как

$this->redirect()->toRoute('home'); 
$this->flashMessenger()->addErrorMessage("There are errors."); 

Все ОК. В методе_1() код

$this->flashMessenger()->addErrorMessage("There are errors."); 
return $this->redirect()->toRoute('home'); 

хорошая работа. Я не понимаю. Кто-нибудь может мне помочь?

Класс A - перенаправление не работает. И сообщение добавляется в сеанс.

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

Класс B - перенаправление рабочей. И сообщение напечатано.

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

Почему и как это работает?

+0

Вы печатали эти сообщения об ошибках в файле вида (или макете)? – tasmaniski

+0

Эти сообщения напечатаны в поле зрения (маршрут «домой»). Но в других представлениях эти мессенги не печатаются. – VEV

+0

Я думаю, было бы лучше, если бы вы разместили весь свой контроллер и просмотрели сценарий; то, что вы написали, не должно быть причиной проблемы. – AlexP

ответ

0

redirect() плагин возвращает Response объект. Вы должны вернуть его в действие.

Update: Я рекомендую двигаться 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) 
    { 
      // ... 
    } 
} 
+0

Если у меня много методов, я должен обернуть каждый метод в if-block? – VEV

+0

Ваше действие должно «возвращаться» либо «Ответ», либо «Объект ViewModel» ... Это ваше решение. –

+0

@ VEV - Я обновил ответ. Пожалуйста, проверь это. –

1

Плагин FlashMessenger, отправить сообщение в пул ожидания (через FlashMessenger Zend MVC плагин), который будет отображаться по запросу другой страницы (через ViewHelper FlashMessenger).

Есть 4 типа сообщений, которые вы можете интегрировать с Bootstrap Уведомления (ошибка, информация, по умолчанию, успех).

Теперь давайте практиковать

В действий в контроллера, вы должны ввести сообщение и ваш бренд:

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'); 
} 

В Посмотреть (.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')); 

Now «са хак, если вы хотите, чтобы просмотреть FlashMessages на экране без resquest НУ перенаправлением (Идеально для ошибок формы, которые вы делаете не переадресовывает или AJAX на другую страницу), используйте renderCurrent и очистите.

echo $ flash-> renderCurrent ('error', array ('alert', 'alert-dismiable', 'alert-danger'));

Если вы хотите углубить лучше на него, следуйте ссылкам Official ZEND 2 документации, дает примерил доступных методов, поможет много:

VIEW ->http://framework.zend.com/manual/current/en/modules/zend.view.helpers.flash-messenger.html

CONTROLLER ->http://framework.zend.com/manual/current/en/modules/zend.mvc.plugins.html#zend-mvc-controller-plugins-flashmessenger

+0

Это нормально, если я вызываю FlashMessager из действия. Но, если у меня есть другой метод в контроллере - ожидающий пул перезаписывается или создается другим в действии, я думаю. – VEV