2

我有一些带有 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');

干得好。我不明白。有谁能够帮我?

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

为什么以及如何工作?

4

2 回答 2

1

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

View中,如果使用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 并清除。

echo $flash->renderCurrent('error', array('alert', 'alert-dismissible', '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#zend-mvc-controller-plugins-flashmessenger

于 2016-02-22T02:42:16.040 回答
1

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)
  {
          // ...
  }
}
于 2015-12-16T08:41:40.493 回答