使用 Zend 框架 FlashMessenger
ZendFramework中的FlashMessenger的名字有点奇怪,因为它与AdobeFlash完全没有关系。它是Zend_Controller_Action_Helper_FlashMessenger类中定义的控制器动作助手,用于存储和检索临时存储在用户会话中的消息。如果您想在页面加载后打印消息的同时提供表单验证和重定向,这将非常有用。如果您熟悉Drupal,那么这个类的行为方式与drupal_set_messages()函数相同。
因为FlashMessenger是一个动作助手,它可以通过多种不同的方式进行初始化,但是,使用控制器的_helper属性(助手代理)可能是最简单的方法。FlashMessenger可以通过以下方式通过辅助代理获取:
通过使用getHelper()helperbroker的方法,传递我们要返回的helper的名称。
$flashMessenger=$this->_helper->getHelper('FlashMessenger');
我们还可以使用__get()助手代理的魔法方法来返回FlashMessenger助手,就好像它是助手代理对象的属性一样。
$flashMessenger=$this->_helper->FlashMessenger;
使用FlashMessenger操作助手非常简单。要将消息添加到FlashMessenger,我们将使用该addMessage()方法并使用该方法获取已设置的任何消息getMessages()。您可以通过将以下代码添加到您的控制器方法之一来测试这一点。它将传递设置到视图的任何消息,然后将字符串“Hello,World”发送到FlashMessenger助手。
$flashMessenger = $this->_helper->getHelper('FlashMessenger'); $this->view->myMessages = $flashMessenger->getMessages(); $flashMessenger->addMessage('Hello, World');
在第一个请求中,该getMessages()方法将返回一个空数组和一个包含第二个请求中设置的消息的数组。将以下内容放入您的视图中,您将看到在第一页刷新后打印的字符串“HelloWorld”。
print_r($this->myMessages);
在这里我应该注意,addMessage()可以通过将字符串传递给帮助代理程序来直接调用FlashMessenger操作帮助程序的。发生这种情况是因为FlashMessenger操作助手实现了该direct()方法,该方法将调用助手中的默认方法。大多数动作助手都有这种功能。
$this->_helper->FlashMessenger('Wedidsomethinginthelastrequest');
您还可以使用该setNamespace()方法将您拥有的任何消息隔离到不同的部分。这将一个字符串作为单个参数,并将设置到该字符串上的所有消息分组。FlashMessenger使用名为“default”的默认命名空间。以下代码设置了一个名为“myMessages”的命名空间并向其添加一条消息。
$flashMessenger = $this->_helper->getHelper('FlashMessenger'); $flashMessenger->setNamespace('myMessages'); $this->view->myMessages = $flashMessenger->getMessages(); $flashMessenger->addMessage('Hello, World');
您可以随时更改命名空间,甚至可以使用resetNamespace()方法将命名空间重置为默认值。例如,这允许您仅将表单验证消息添加到表单命名空间,将系统消息添加到系统命名空间。
使用FlashMessenger的一种简洁方式是将其封装到动作控制器中的辅助方法中。这省去了每次要使用FlashMessenger对象并设置命名空间的麻烦。以下方法可以添加到控制器类中,并将存储传递给它的单个消息。
protected function _flashMessage($message) { $flashMessenger = $this->_helper->FlashMessenger; $flashMessenger->setNamespace('myMessages'); $flashMessenger->addMessage($message); }
以下代码显示了对该方法的两个不同调用,每个调用都设置了不同的值。
$this->_flashMessage('Message!'); $this->_flashMessage('Random number = ' . rand());
然后使用以下代码将消息发送到视图,如果需要,也可以将其封装到自己的方法中。
$flashMessenger = $this->_helper->FlashMessenger; $flashMessenger->setNamespace('myMessages'); $this->view->myMessages = $flashMessenger->getMessages();
如果您想首先检查是否有任何可用消息,您可以使用该hasMessaged()方法。如果您选择的消息命名空间包含任何消息,这将返回true。
$flashMessenger->hasMessages();
在视图脚本文件中,以下代码片段可用于打印出块中的消息。使用循环意味着您可以添加多条消息,并且仍然期望输出看起来不错。
myMessages)) { $result = ''; $result .= '
- ' . PHP_EOL;
foreach ($this->myMessages as $message) {
$result .= '
- ' . $message . ' ' . PHP_EOL; } $result .= '
要清除命名空间中的所有消息,您可以使用该clearMessages()函数。还有一种count()方法可以返回可用消息的数量。
到目前为止,我只研究了正常的消息操作方法。该addMessage()方法将始终向当前命名空间添加一条消息,但在检查消息时,您可以使用多种方法,这些方法只会查看当前请求中设置的那些消息。该hasCurrentMessages()方法用于查明当前请求中是否添加了任何消息。的getCurrentMessages()返回已添加到当前请求的任何消息。下面显示了这些方法的作用。
$flashMessenger = $this->_helper->FlashMessenger; $flashMessenger->setNamespace('myMessages'); print_r($flashMessenger->getMessages()); $flashMessenger->addMessage('Hello World'); $flashMessenger->hasCurrentMessages(); print_r($flashMessenger->getCurrentMessages());
从getCurrentMessages()方法调用第一次加载页面后,上面的代码将打印出一个“HelloWorld”。由于getMessages()方法调用,它会在重新加载页面后打印两个“HelloWorld”字符串。