追加、編集、削除等の処理後に重複処理を避ける為に
リダイレクトするのは良くある処理の一つです。
そこで、リダイレクト先の処理完了画面へ、
メッセージを送りたい事があります。
例えば、『○○の編集が完了しました』等です。
これは、何を処理したかはリダイレクトされる前の画面の話ですので、
前の画面からリダイレクト先へ値を渡さないと
完了画面では何が処理されて来たのかを知る事が出来ません。
そこで、一般的にはセッションの利用を思いつくかと思います。
セッション変数に値をセットし、リダイレクト先でセッションから
値を取得し・・・
ちょっと面倒ですよね?
ZendFramework2(ZF2)では、その辺りの処理を簡単に行える様に
便利なプラグインが用意されています。
その名も『flashMessenger』
今回は、そんなflashMessengerの使用方法をソースコード付きで解説したいと思います
flashMessengerを使って完了メッセージを引き渡そう
大前提として、flashMessengerプラグインを使用する為には
AbstractActionControllerかAbstractRestfulController内で使用する必要があります。
勿論、AbstractActionControllerやAbstractRestfulControllerを継承した
コントローラ内のアクションでも使用可能です。
早速、アクションの実装コードを記します
namespace User\Controller; use Zend\Mvc\Controller\AbstractActionController; class Hoge extends AbstractActionController /* 処理を行うアクション ----------------------------------------------------------------------------------*/ public function processAction() { // フラッシュマネージャへ受け渡すメッセージを追加する $this->flashMessenger()->addMessage( "受け渡すメッセージ" ); // successActionへリダイレクトする return( $this->redirect()->toUrl( 'success' ) ); } /* 処理後に実行するアクション ----------------------------------------------------------------------------------*/ public function successAction() { // フラッシュマネージャープラグインのハンドルを取得 $flashMessenger = $this->flashMessenger(); // 現在の要求中に追加されたものがあるのかチェック if( $flashMessenger->hasMessages() ){ // メッセージの取得(配列) $message_array = $flashMessenger->getMessages(); // メッセージを確認 echo $message_array[0]; } } }
processActionは、いわゆる追加や削除、編集等を行うアクションで、
そういった処理後に完了メッセージと共に完了画面へリダイレクトします。
完了画面はsuccessActionに用意し、
受け取ったメッセージを取得する事が出来ます。
hasMessages()でメッセージがあるか確認する事が出来ますので、
メッセージがある時だけ画面に通知するといった処理も可能です。
他にも、flashMessengerプラグインにはいくつかのメソッドが用意されていますので、
一覧を下記に記します。
setSessionManager() | 代わりにセッションマネージャを使用する時にはこのメソッドでセットします |
---|---|
getSessionManager() | 代わりに使用したセッションマネージャを取得します。 |
getContainer() | フラッシュメッセージが格納されているコンテナのインスタンスを取得します(Zend\Session\Container) |
setNamespace() | コンテナに特定の名前空間を指定したい時に使用します。 |
getNamespace() | フラッシュメッセージのの名前空間を取得します。 |
addMessage() | セッションのコンテナにメッセージを追加します。 |
hasMessages() | セッションのコンテナ内に名前空間を考慮した任意のメッセージがあるか判定します。 |
getMessages() | セッションコンテナから、現在の名前空間にあったメッセージを取得します。 |
clearMessages() | セッションコンテナ内の、現在の名前空間内のメッセージを全て削除します。 |
hasCurrentMessages() | 全てのメッセージは、現在の要求中に追加されたものか判定します。 |
getCurrentMessages() | 現在の要求の間に追加された全てのメッセージを取得します。 |
clearCurrentMessages() | 現在の要求の間に追加された全てのメッセージを削除します。 |
とても頻繁に使うプラグインかと思いますので、
なるべく早い段階で動きを把握しておくと良いかも知れません。