アクショングループ

一連の処理に関するアクションのグループをアクショングループといいます。たとえば「新規登録」は

「フォーム画面」→「確認画面」→「書込処理」

という一連の処理から成り立ちます。それぞれの処理を各アクションが担いますが、これらのアクションをまとめたものをアクショングループといいます。たとえば主なアクショングループとして以下のものがあります。

アクショングループを適用することによって、コントローラ全体には適用したくないが一部のアクション群に適用した共通処理や、「戻る」処理が可能になります。上記のアクショングループの具体的な構造と処理の内容は具体的なアクショングループを参照してください。

アクショングループの実装方法

新規登録処理に関するアクショングループを考えます。グループ名をregistとします。新規登録処理は

「フォーム画面」→「確認画面」→「書込処理」

という処理の流れになりますが、アクションに分けて

フォーム画面
index
確認画面
confirm
書込処理
commit

とします。すなわちアクショングループregistのアクションindexconfirmcommitということになりますが、これをコントローラ内では以下のように実装します。

<?
class ctrlXxx extends CZCtrl {

	public function registIndex() {		// http://mydomain.com/index.php/xxx/regist/index
			:
	}

	public function registConfirm() {	// http://mydomain.com/index.php/xxx/regist/confirm
			:
	}

	public function registCommit() {	// http://mydomain.com/index.php/xxx/regist/commit
			:
	}

}
?>

グループを設定しない場合メソッド名のプレフィクスはactionでしたが、グループ内のメソッドの場合プレフィクスがグループ名になります。プレフィクス直後の文字は大文字となります。上記のコントローラの場合対応するURLは

index
http://mydomain.com/index.php/xxx/regist/index
confirm
http://mydomain.com/index.php/xxx/regist/confirm
commit
http://mydomain.com/index.php/xxx/regist/commit

となります。1個のコントローラ内にアクショングループは複数設定可能で、アクショングループに属さないアクションとも同居可能です。また含まれるアクションが1個の場合でもアクショングループとして実装することは可能です。

<?
class ctrlXxx extends CZCtrl {

	public function _construct() {		// コンストラクタ

	}

	public function actionYyy() {		// http://mydomain.com/index.php/xxx/yyy

	}

	public function actionZzz() {		// http://mydomain.com/index.php/xxx/zzz

	}

	public function registIndex() {		// http://mydomain.com/index.php/xxx/regist/index

	}

	public function registConfirm() {	// http://mydomain.com/index.php/xxx/regist/confirm

	}

	public function registCommit() {	// http://mydomain.com/index.php/xxx/regist/commit

	}

	public function updateIndex() {		// http://mydomain.com/index.php/xxx/update/index

	}

	public function updateConfirm() {	// http://mydomain.com/index.php/xxx/update/confirm

	}

	public function updateCommit() {	// http://mydomain.com/index.php/xxx/update/commit

	}

}
?>

URLでアクショングループ名が指定され、アクション名がない場合はそのグループのindexとして認識します。URLを決める際に、アクション名を省略したURLすなわち

http://mydomain.com/index.php/update/

でどんな処理をしたいか(何を表示したいか)によってアクションupdateIndexの内容を決めるといいでしょう。

これまでのルールに基づくとactionUpdate()(グループに属さないupdate)とupdateIndex()updateグループのインデックス)のいずれでも上記のURLにアクセスできますが、前者が優先されます(両方定義している場合は後者が無視されます)。

アクショングループを設定する意義

一連の処理をわざわざアクショングループ化することで、以下のことが可能になります。

戻る処理

データ更新などの処理後に元の画面に戻る時や戻るボタンを押した時の戻り先を適切に決める機構です。ページ遷移が複雑になると一口に戻るといってもどのページ(アクション)に戻るか必ずしも一意ではなく、従来はアクセス元に応じてプログラム内で戻り先を書き分ける必要がありました。

しかしアクショングループを設定することで、現在アクショングループに移る直前のページ(コントローラ/アクショングループ/アクション)を記憶し、現在のアクショングループの処理が終わったらそのページに戻すことが可能になります。コントローラをまたいでもこれは可能です。

アクショングループを適用した上でビュー変数の$_return_urlビュー変数を参照)やCZCtrl::redirectReturn()アクショングループを利用したページ遷移を参照)を利用してこの直前のページに戻ります。

アクショングループ内のメソッドを実行する際の共通処理、初期化処理

グループ内特殊アクションのような用途をする場合です。

これらはグループを適用してグループ内外の処理を切り分けることで可能になります。逆にこれらを利用しない、つまり「戻る」処理を自動化せず、アクショングループとしての初期化や共通処理も実装しないのであればアクショングループを実装する必要はありません

グループ内特殊アクション

グループ内のアクションの中にはあらかじめ特殊な挙動をするように定められたものがあります。仮にグループ名をyyyとすると、プレフィクスを付けた以下のメソッド

yyy_common()
グループ内のどのメソッドが呼ばれても共通して最初に実行される処理です。
  • アクショングループ内共通のビュー変数の設定
  • 処理の種類(アクショングループ)による権限分け(グループ一覧表示/詳細表示はログインチェックをしないが更新/削除はチェックをする)
などを記述します。
yyy_init()
他のアクショングループから当該アクショングループに移ってきた(転送、リダイレクトのいずれも)時だけ最初に呼び出されるメソッドです。
  • フォームの初期化処理(新規登録ならフォームを空に、更新なら古いレコードの値を入れておく)
  • IDを受け取ってセット
などを記述します。

これらは通常のアクションと異なり、URLで指定して呼び出すことができません。

yyyIndexはアクション名が省略されたときに呼び出されるアクションです。URLを決める際に、アクション名を省略したURLすなわち

http://mydomain.com/index.php/yyy/

でどんな処理をしたいか(何を表示したいか)によってアクションyyyIndexの内容を決めるといいでしょう。

アクショングループを利用したページ遷移

アクショングループを適用した場合の転送(フォワード)処理やリダイレクト処理です。

CZCtrl::_forward(array $action, array $params = NULL)
引数$actionで指定したアクションに処理を転送します。$actionアクション形式の配列で、第1要素がアクション名、第2要素がアクショングループ名、第3要素がコントローラ名となります。 コントローラ名にFALSEを指定した場合、現在のコントローラと同じコントローラの、アクショングループ名にFALSEを指定した場合、現在のアクショングループと同じアクションに転送されます。
$action=array('confirm', FALSE, FALSE)

引数$paramsでアクションに与えるパラメータを指定することができます。リクエストパラメータ形式の連想配列です。 たとえば
$this->_forward(array('index', 'list', 'product'), array(
'routing' => array('game'),
'get' => array('pn' => 2),
));
の場合、
http://mydomain.com/index.php/product/list/game?pn=2
に転送する処理となります。
間違えやすい問題として、
$this->_forward(array('index', FALSE, 'product'));
$this->forward(array('index', 'product'));
は全く挙動が異なることに注意してください。
CZCtrl::_checkPrevActions(array $actions)
直前のアクションが指定したアクション以外の時に403エラーへ転送します。 引数の$actionsアクション形式の配列を複数並べた配列
$this->_checkPrevActions(
	array('アクション名', 'アクショングループ名', 'コントローラ名'),
	array('confirm', 'update', 'item'),
	array('confirm', 'insert', 'item'),
		:
);
となります。アクショングループを使用するアクションとアクショングループを使用しないアクションが混在する場合、アクショングループ名の部分にNULLを入れるとアクショングループを使用しない場合の指定ができます。
$this->_checkPrevActions(
	array('confirm', 'update', 'item'),
	array('delete', NULL, 'item'),
		:
);
CZCtrl::_redirect(array $action, bool $secure_flag = FALSE, array $params = NULL)
引数$actionで指定したアクションにリダイレクトします。$actionアクション形式の配列で、第1要素がアクション名、第2要素がアクショングループ名、第3要素がコントローラ名となります。 コントローラ名にFALSEを指定した場合、現在のコントローラと同じコントローラの、アクショングループ名にFALSEを指定した場合、現在のアクショングループと同じアクションにリダイレクトします。
$secure_flagでリダイレクト先を「https://」にするか「http://」にするかを指定できます。TRUEにすると「https://」で始まるセキュアなURLにリダイレクトします。
引数$paramsでアクションに与えるパラメータを指定することができます。リクエストパラメータ形式の連想配列です。
CZCtrl::_redirectReturn()
現在のアクショングループに移る直前のURLに戻ります。コントローラをまたいだ場合はまたぐ直前のURLとなります。
すなわち直接アプリケーション外から現在のアクショングループにアクセスして来た場合にリダイレクトする先のアクションを$default_actionで指定します。アクション形式の配列で、第1要素がアクション名、第2要素がコントローラ名となります。 直接アプリケーション外からアクセスした時、$default_actionが指定されていなければFALSEが返る(エラーになる)ので、これを実行するときには基本的に設定する必要があります。
$secure_flagでリダイレクト先を「https://」にするか「http://」にするかを指定できます。TRUEにすると「https://」で始まるセキュアなURLにリダイレクトします。
リダイレクトする際、直前のページのURLに付いていたリクエスト文字列もそのまま付けますが、引数$paramでアクションに与えるパラメータを変更することができます。リクエストパラメータ形式の連想配列です。
この機能を利用する場合、戻り先のURLを常にセッション情報として保存しておく必要があるため、その分メモリを消費します。 設定ファイル{(app_root), _common}/configs/Forward.phpの「戻る」設定return_flagをFALSEにすることこの機能を無効化し、メモリを節約することができます。ホームページ(デフォルトコントローラ)へ遷移すると、戻り先URLのセッションデータは削除され、この機能は使えなくなります。ただし
http://mydomain.com/home
などのようにコントローラ名がURLにある場合は削除されません。

グループに属さないアクションに転送やリダイレクトをする場合はforward()redirect()を、グループに属するアクションに転送やリダイレクトをする場合は_forward()_redirect()を実行します。

具体的なアクショングループ

コントローラitemにおけるアクショングループとアクションの実装例を一覧にしています。

一覧表示

グループ名list

アクション名 処理内容 プレフィクス付き
メソッド名
URL
index 一覧表示 listIndex() http://mydomain.com/item/list
search 検索 listSearch() http://mydomain.com/item/list/search

新規登録

グループ名regist

アクション名 処理内容 プレフィクス付き
メソッド名
URL
init 初期化 regist_init($replace_form_values = NULL) -
index フォーム画面 registIndex() http://mydomain.com/item/regist
confirm 確認画面 registConfirm() http://mydomain.com/item/regist/confirm
commit 書込処理 registCommit() http://mydomain.com/item/regist/commit

更新

グループ名update

アクション名 処理内容 プレフィクス付き
メソッド名
URL
init 初期化 update_init($id = NULL) -
index フォーム画面 updateIndex() http://mydomain.com/item/update
confirm 確認画面 updateConfirm() http://mydomain.com/item/update/confirm
commit 書込処理 updateCommit() http://mydomain.com/item/update/commit

詳細表示

グループ名detail

アクション名 処理内容 プレフィクス付き
メソッド名
URL
index 詳細表示 detailIndex($id = NULL) http://mydomain.com/item/detail/$id

削除

グループ名update

アクション名 処理内容 プレフィクス付き
メソッド名
URL
init 初期化 delete_init($id = NULL) -
index 確認画面 deleteIndex($id = NULL) http://mydomain.com/item/delete/$id
commit 削除処理 deleteCommit() http://mydomain.com/item/delete/commit

listdetailには1個しかメソッドがありませんが、「戻る」機能を使用するためにアクショングループとして実装しています。

前後のページ

ページトップへ