Php 为什么Zend';s的FlashMessenger getMessages方法不工作?

Php 为什么Zend';s的FlashMessenger getMessages方法不工作?,php,zend-framework,Php,Zend Framework,我正在使用Zend 1.12和php 5.4.3,flashMessenger->getMessages()突然停止在控制器操作中工作 在AController中,创建了特定类型的帐户,创建它需要9个步骤,因此我有9个操作create1-9Action 在每一步中,我都使用flashmessenger将表单数据传递到下一步。 这是动作的典型结构: public function create5Action() { $form = new My_Form(); $messages = $t

我正在使用Zend 1.12和php 5.4.3,flashMessenger->getMessages()突然停止在控制器操作中工作

在AController中,创建了特定类型的帐户,创建它需要9个步骤,因此我有9个操作create1-9Action

在每一步中,我都使用flashmessenger将表单数据传递到下一步。 这是动作的典型结构:

public function create5Action()
{
  $form = new My_Form();
  $messages = $this->_helper->flashMessenger->getMessages();
  $data = $messages[0];
  if ($this->_request->isPost())
  {
    if ($form->isValid($this->_request->getPost()))
    {
       /* form treatment */

      $this->_helper->flashMessenger->addMessage($data);
      $this->_redirect($this->_helper->url("create6", "A", null)); // redirect to next step
    }
  }

  $this->_helper->flashMessenger->addMessage($data);
  $this->view->form = $form;
}

在这个操作(create5)中,当从create4Action到达时,数据是完整的,当它作为消息添加到
$this->view->form=$form之前时,数据是完整的,但当我向表单添加新元素并提交它时,
$messages=$this->\u helper->flashMessenger->getMessages()
为空,我不知道为什么,因为它适用于所有其他操作。

您可能没有在
isPost()
循环中添加
else

public function create5Action()
{
  $form = new My_Form();
  $messages = $this->_helper->flashMessenger->getMessages();
  $data = $messages[0];
  if ($this->_request->isPost())
  {
    if ($form->isValid($this->_request->getPost()))
    {
       /* form treatment */

      $this->_helper->flashMessenger->addMessage($data);
      $this->_redirect($this->_helper->url("create6", "A", null)); // redirect to next step
    }
  } else {

      $this->_helper->flashMessenger->addMessage($data);
      $this->view->form = $form;
    }
}
但是,这不是flash messenger的预期用途。我认为您的问题的一部分是,每次发出请求时,在调度循环的
postDispatch()
部分中,flash messenger命名空间都会被清除

您最好使用自己的实例,而不是依赖flash messenger正在使用的实例

public function create5Action()
    {
      $session = new Zend_Session_Namespace('data');//set elsewhere and forwarded and can be persistent
      $form = new My_Form();     
      $data = $session->data;
      if ($this->_request->isPost())
      {
        if ($form->isValid($this->_request->getPost()))
        {
           /* form treatment */

          $session->newData = $newData;//forward data if needed, old data will persist as you require
          $this->_redirect($this->_helper->url("create6", "A", null)); // redirect to next step
        }
      } else {
          $this->view->form = $form;
        }
    }

这并不是FlashMessenger的真正用途,您应该创建一个会话名称空间对象,并使用它如何使用FlashM。我从一开始就没有使用名称空间,就是这样,flashmessenger也没有像我想要的那样工作。Zend_会话_名称空间似乎更适合。事实上,我试图添加带有名称空间的消息,但没有效果,我看到了您发布的问题。如果我直接修改$session->data,比如
$session->data[“newData”]=$newData
,它会自动修改Zend_session_名称空间中的数据?实际上您会使用它$session->data=''$会话->新数据=“”;$session已引用“data”命名空间。您可以根据需要添加/删除更改密钥。您可以保存字符串、数组或对象。感谢您的帮助。else并不是真正需要的,因为如果请求是post并且表单没有经过验证,我不会做任何事情,实际上它应该处于相同的if条件。如果表单有效,我将重定向到另一个控制器,因此else始终是IFT下的内容通常ZF操作中的工作流将测试ifPost()=true do isValid()else显示表单并接受post事件的数据。isValid()也是如此,我们通常会重新显示表单并在需要时填充它!isValid()。不过,我很高兴你能成功。