php教程

超轻量级php框架startmvc

Zend Framework动作助手FlashMessenger用法详解

更新时间:2020-03-08 01:19:16 作者:startmvc
本文实例讲述了ZendFramework动作助手FlashMessenger用法。分享给大家供大家参考,具体如下:Fla

本文实例讲述了Zend Framework动作助手FlashMessenger用法。分享给大家供大家参考,具体如下:

FlashMessenger 用来处理Flash Messenger会话;FlashMessenger是一个神奇的助手。

有这么一种场景,在用户注册成功后,需要在提示页面上显示用户的名称,如果不通过get传递请求,当然你也可以通过session传递

要显示的用户名称。但是seesion的操作难免复杂,可以使用Flash Messenger快速的实现这个需求。

FlashMessenger助手允许你传递用户可能需要在下个请求看到的消息

FlashMessenger也是使用Zend_Session_Namespace来存储消息以备将来或下个请求来读取,但是相对简单一些

FlashMessenger简单用法

在helper_demo1项目的基础上

新增/helper_demo1/application/controllers/UserController.php


<?php
class UserController extends Zend_Controller_Action
{
 protected $_flashMessenger = null;
 public function init()
 {
 $this->_flashMessenger =
 $this->_helper->getHelper('FlashMessenger');
 $this->initView();
 }
 public function registerAction()
 {
 $this->_flashMessenger->addMessage('xxxxx,Welcome!');
 $this->_helper->redirector('regtips');
 }
 public function regtipsAction()
 {
 $this->view->messages = $this->_flashMessenger->getMessages();
 }
}

新增/helper_demo1/application/views/scripts/user/regtips.phtml


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>test</title>
</head>
<body>
<?php
var_dump($this->messages);
?>
</body>
</html>

访问http://www.localzend.com/helper_demo1/public/user/register 跳转到http://www.localzend.com/helper_demo1/public/user/regtips

FlashMessager实现源码如下


<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category Zend
 * @package Zend_Controller
 * @subpackage Zend_Controller_Action_Helper
 * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license http://framework.zend.com/license/new-bsd New BSD License
 */
/**
 * @see Zend_Session
 */
require_once 'Zend/Session.php';
/**
 * @see Zend_Controller_Action_Helper_Abstract
 */
require_once 'Zend/Controller/Action/Helper/Abstract.php';
/**
 * Flash Messenger - implement session-based messages
 *
 * @uses Zend_Controller_Action_Helper_Abstract
 * @category Zend
 * @package Zend_Controller
 * @subpackage Zend_Controller_Action_Helper
 * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license http://framework.zend.com/license/new-bsd New BSD License
 * @version $Id: FlashMessenger.php 23775 2011-03-01 17:25:24Z ralph $
 */
class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable
{
 /**
 * $_messages - Messages from previous request
 *
 * @var array
 */
 static protected $_messages = array();
 /**
 * $_session - Zend_Session storage object
 *
 * @var Zend_Session
 */
 static protected $_session = null;
 /**
 * $_messageAdded - Wether a message has been previously added
 *
 * @var boolean
 */
 static protected $_messageAdded = false;
 /**
 * $_namespace - Instance namespace, default is 'default'
 *
 * @var string
 */
 protected $_namespace = 'default';
 /**
 * __construct() - Instance constructor, needed to get iterators, etc
 *
 * @param string $namespace
 * @return void
 */
 public function __construct()
 {
 if (!self::$_session instanceof Zend_Session_Namespace) {
 self::$_session = new Zend_Session_Namespace($this->getName());
 foreach (self::$_session as $namespace => $messages) {
 self::$_messages[$namespace] = $messages;
 unset(self::$_session->{$namespace});
 }
 }
 }
 /**
 * postDispatch() - runs after action is dispatched, in this
 * case, it is resetting the namespace in case we have forwarded to a different
 * action, Flashmessage will be 'clean' (default namespace)
 *
 * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
 */
 public function postDispatch()
 {
 $this->resetNamespace();
 return $this;
 }
 /**
 * setNamespace() - change the namespace messages are added to, useful for
 * per action controller messaging between requests
 *
 * @param string $namespace
 * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
 */
 public function setNamespace($namespace = 'default')
 {
 $this->_namespace = $namespace;
 return $this;
 }
 /**
 * resetNamespace() - reset the namespace to the default
 *
 * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
 */
 public function resetNamespace()
 {
 $this->setNamespace();
 return $this;
 }
 /**
 * addMessage() - Add a message to flash message
 *
 * @param string $message
 * @return Zend_Controller_Action_Helper_FlashMessenger Provides a fluent interface
 */
 public function addMessage($message)
 {
 if (self::$_messageAdded === false) {
 self::$_session->setExpirationHops(1, null, true);
 }
 if (!is_array(self::$_session->{$this->_namespace})) {
 self::$_session->{$this->_namespace} = array();
 }
 self::$_session->{$this->_namespace}[] = $message;
 return $this;
 }
 /**
 * hasMessages() - Wether a specific namespace has messages
 *
 * @return boolean
 */
 public function hasMessages()
 {
 return isset(self::$_messages[$this->_namespace]);
 }
 /**
 * getMessages() - Get messages from a specific namespace
 *
 * @return array
 */
 public function getMessages()
 {
 if ($this->hasMessages()) {
 return self::$_messages[$this->_namespace];
 }
 return array();
 }
 /**
 * Clear all messages from the previous request & current namespace
 *
 * @return boolean True if messages were cleared, false if none existed
 */
 public function clearMessages()
 {
 if ($this->hasMessages()) {
 unset(self::$_messages[$this->_namespace]);
 return true;
 }
 return false;
 }
 /**
 * hasCurrentMessages() - check to see if messages have been added to current
 * namespace within this request
 *
 * @return boolean
 */
 public function hasCurrentMessages()
 {
 return isset(self::$_session->{$this->_namespace});
 }
 /**
 * getCurrentMessages() - get messages that have been added to the current
 * namespace within this request
 *
 * @return array
 */
 public function getCurrentMessages()
 {
 if ($this->hasCurrentMessages()) {
 return self::$_session->{$this->_namespace};
 }
 return array();
 }
 /**
 * clear messages from the current request & current namespace
 *
 * @return boolean
 */
 public function clearCurrentMessages()
 {
 if ($this->hasCurrentMessages()) {
 unset(self::$_session->{$this->_namespace});
 return true;
 }
 return false;
 }
 /**
 * getIterator() - complete the IteratorAggregate interface, for iterating
 *
 * @return ArrayObject
 */
 public function getIterator()
 {
 if ($this->hasMessages()) {
 return new ArrayObject($this->getMessages());
 }
 return new ArrayObject();
 }
 /**
 * count() - Complete the countable interface
 *
 * @return int
 */
 public function count()
 {
 if ($this->hasMessages()) {
 return count($this->getMessages());
 }
 return 0;
 }
 /**
 * Strategy pattern: proxy to addMessage()
 *
 * @param string $message
 * @return void
 */
 public function direct($message)
 {
 return $this->addMessage($message);
 }
}

Zend Framework 动作助手 FlashMessenger