FlashMessenger 利用 Zend_Session_Namespace 在請求間暫存訊息,下一個請求自動取出並清除,適用於「導向後顯示成功/錯誤訊息」等場景,避免手動操作 Session 的繁瑣。
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();
}
}
<?php var_dump($this->messages); ?>
關鍵實作細節:
$_messages、$_session、$_messageAdded 共享跨實例狀態$_messages 並清除 SessionpostDispatch() 自動重設命名空間為 'default'addMessage() 設定 Session 過期跳數為 1 (下一請求即失效)IteratorAggregate、Countable 介面,支援 foreach 與 count()class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Action_Helper_Abstract
implements IteratorAggregate, Countable {
static protected $_messages = array();
static protected $_session = null;
static protected $_messageAdded = false;
protected $_namespace = 'default';
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});
}
}
}
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;
}
public function getMessages() {
if ($this->hasMessages()) return self::$_messages[$this->_namespace];
return array();
}
// ... hasMessages, clearMessages, hasCurrentMessages, getCurrentMessages, clearCurrentMessages
public function getIterator() { return new ArrayObject($this->getMessages()); }
public function count() { return $this->hasMessages() ? count($this->getMessages()) : 0; }
public function direct($message) { return $this->addMessage($message); }
}
// 設定專屬命名空間
$this->_flashMessenger->setNamespace('user_auth')->addMessage('登入成功');
// 取得特定命名空間訊息
$messages = $this->_flashMessenger->setNamespace('user_auth')->getMessages();
// 重設為預設
$this->_flashMessenger->resetNamespace();
FlashMessenger 以 Session 命名空間為後端,封裝「寫入即設定單次過期、讀取即自動清除」的閃存訊息模式,並支援命名空間隔離、迭代器介面,是跨請求傳遞臨時訊息的最佳實踐。