コントローラとURL

クライアントはまずフロントコントローラにアクセスします。

フロントコントローラ

フロントコントローラはクライアントが直接アクセスするスクリプト、すなわちアプリケーションへのリクエストを受け付ける窓口となるスクリプトで、index.php等の名前でWebサーバのWeb公開ディレクトリ(/var/www/htmlpublic_htmlなど)に設置します。公開ディレクトリに設置するスクリプトは基本的にこの一つだけで結構です。フロントコントローラからフレームワークとアプリケーションのプログラムを呼び出します。以下のように記述します。

<?
try {
	require_once '/path/to/Chimpanzee-X.X/Chimpanzee.php';
	$cz = new Chimpanzee('/path/to/project01', 'application01');
	$cz->exec();
} catch (CZException $e) {
	echo 'Fatal error : ' . $e->getMessage();
}
?>

Chimpanzee.phpを呼び出してChimpanzeeクラスのインスタンスを生成し、Chimpanzee::exec()を実行します。
コンストラクタの引数としてプロジェクトディレクトリの絶対パスアプリケーション名を指定します。メソッドexec()でデフォルトコントローラを指定することができます。

Chimpanzee::exec(string $ctrl_name)
フレームワークを実行します。
$ctrl_nameでリクエスト中にコントローラ名が指定されていない場合に参照するコントローラ(デフォルトコントローラ)名を指定できます。
省略した場合の挙動など詳細はコントローラデフォルトアクションを参照してください。

コントローラ

MVCフレームワークでアプリケーションとしてのさまざまな処理を行うのがコントローラということになりますが、個別の処理はコントローラクラス内の各メソッドとして記述します。このコントローラ内のメソッドをアクションといいます。一つのコントローラは一つもしくは複数のアクションを含みます。

コントローラとアクション名を指定したURLがリクエストされると、指定したコントローラ内のアクションが呼び出されることになります。コントローラはCZCtrlクラスで制御します。

実装方法

コントローラ名をxxxとした場合クラス名はXxxとなり(コントローラクラスのプレフィクスを付けるとctrlXxx)クラスファイルは

(app_root)/ctrls

内にXxx.phpという名前で設置します。コントローラクラスは以下の構造になります。

<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
		// 処理の記述
		echo 'Hello, World.';
	}

	public function actionZzz() {
		// 処理の記述
	}
		:
}
?>

コントローラのメソッドがアクションになります。アクション名をyyyとするとメソッド名はプレフィクスactionを付けてactionYyyとなります。

コントローラ名はURLの第1セグメントとなりますので、それを意識して名前を決めるといいでしょう。アクション名はURLの第2セグメント以降になります。

アクションを「新規登録処理」「削除処理」など一連の処理をグループとしてまとめて扱う(詳細はアクショングループ機能を参照)場合、actionの代わりにアクショングループ名がメソッド名のプレフィクスとなります。

アクショングループregの中にアクションformconfirmが、アクショングループdelの中にアクションconfirmcommitがある場合

<?
class ctrlXxx extends CZCtrl {

	public function regForm() {
		// 処理の記述
	}

	public function regConfirm() {
		// 処理の記述
	}

	public function delConfirm() {
		// 処理の記述
	}

	public function delCommit() {
		// 処理の記述
	}

	public function actionZzz() {
		// 処理の記述
	}
		:
}
?>

グループに属さないアクションzzzとの共存も可能です。

メソッドをプライベートなものとして定義した場合はクライアントからのリクエストは受け付けられません。これを利用してコントローラ内の共通処理関数などを定義することも可能です。

デフォルトコントローラ

コントローラが指定されていない場合に呼び出されるコントローラがデフォルトコントローラです。初期状態ではtopすなわち

(app_root)/ctrls/Top.php

が呼び出されますが、フロントコントーラ内のChimpanzee::exec(string $ctrl_name)で指定することもできます。

自動初期実行コントローラ

ini_set()のようにすべてのプログラムを実行する前に共通して実行する必要のある処理があります。それを実行するのが自動初期実行コントローラです。C言語でいうmain関数、クラスにおけるコンストラクタのような役割になります。

(app_root)/ctrls/_Main.php

はすべてのコントローラを読み込む前に共通して最初に読み込まれます。このファイルがない場合は自動初期実行処理は行われません。このコントローラの内容は以下のようになります。

<?
class ctrl_Main extends CZCtrl { 

	public function _construct() { 
		// 自動初期実行処理を記述 
		ini_set('include_path', '/path/to/PEAR' . PATH_SEPARATOR . ini_get('include_path')); 
	} 

} 
?>

メソッドは_construct()のみとなります。コントローラ「_Main」を使う用途は

などがあります。

URL

リクエスト形式

ChimpanzeeでリクエストされるURLは、フロントコントローラのURLの後にコントローラ名とアクション名を指定した以下の形式になります。

http://フロントコントローラ/コントローラ名/アクション名/

アクションにグループを適用した場合は

http://フロントコントローラ/コントローラ名/グループ名/アクション名/

となります。フロントコントローラのURLが

http://mydomain.com/index.php

でコントローラ名がxxx、アクション名がyyyの場合、

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

コントローラ名がxxx、アクショングループ名がreg、アクション名がformの場合、

http://mydomain.com/index.php/xxx/reg/form

となります。個別のアクションに渡す引数(リクエスト変数)はアクション名の後スラッシュ区切りで指定します。

http://mydomain.com/index.php/xxx/yyy/1/20
http://mydomain.com/index.php/xxx/reg/form/1/20

アクションごとのリクエスト変数はメソッド(アクション)の引数として定義します。たとえばコントローラProductすなわち(app_root)/ctrls/Product.phpの内容が

<?
class ctrlProduct extends CZCtrl {

	public function actionIndex() {
		// 処理1
		$this->addViewVar(...); // 表示1
	}

	public function actionDetail($id = NULL) {
		// 処理2
		if ($id) {
			:
		}
		$this->addViewVar(...); // 表示2
	}

	public function actionEdit($id = NULL, $user = NULL) {
		// 処理3
		$this->addViewVar(...); // 表示3
	}

}
?>

の場合(アクション名にはプレフィクスactionが付いています。詳細はアクションの実装方法を参照してください)、アクションindexへは

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

でアクセスできます。アクションdetailは引数$idがあるため

http://mydomain.com/index.php/product/edit/10

id = 10としてアクセスできます。リクエスト変数が複数ある場合、上記のeditのようにアクションの引数として複数の変数をもたせることで実装します。リクエスト変数の順番はアクションの引数として定義した順番に一致します。したがって上記の場合、

http://mydomain.com/index.php/product/detail/10/5

id = 10, user = 5としてアクセスできます。引数の数が少ない場合はアクションの定義どおりの扱い(上記の$userでいえばNULL)に、多い場合は前から数えて所定の数を超えた引数(上記の例では第3引数以降)が無視されます。

URLでアクション名を省略した場合、アクションindexが呼び出されます。したがって

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

はいずれもコントローラproductのアクションindexにアクセスします。

アクショングループを利用する場合

<?
class ctrlXxx extends CZCtrl {

	public function regIndex($user, $manager) {
		// 処理の記述
	}

	public function regForm() {
		// 処理の記述
	}

	public function regConfirm() {
		// 処理の記述
	}

	public function regCommit() {
		// 処理の記述
	}

	public function delIndex($id = NULL) {
		// 処理の記述
	}

	public function delCommit() {
		// 処理の記述
	}

	public function actionZzz() {
		// 処理の記述
	}
		:
}
?>

というコントローラの場合、グループregアクションconfirmへは

http://mydomain.com/index.php/xxx/reg/confirm

でアクセスできます。グループdelアクションindexは引数$idがあるため

http://mydomain.com/index.php/xxx/del/index/10

id = 10としてアクセスできます。この中でもグループに属さないアクションの場合は

http://mydomain.com/index.php/xxx/zzz

のようにコントローラ名の後に直接アクション名を指定すればアクセスできます。グループを適用した場合(アクション名にaction以外のプレフィクスを付けた場合)の違いはコントローラ名とアクション名の間にグループ名が入るだけです。リクエスト変数が複数ある場合もアクション名の後に付けるだけでグループがない場合と同様の挙動になります。

http://mydomain.com/index.php/xxx/reg/index/10/5

またURLでグループ名を指定してアクション名を省略した場合はそのグループのアクションindexが呼び出されます。つまり

http://mydomain.com/index.php/xxx/del/index/10
http://mydomain.com/index.php/xxx/del/10

はいずれもコントローラdelのアクションindexid = 10としてアクセスします。

クエリ文字列形式

URLを用いたリクエストパラメータは

http://mydomain.com/index.php/xxx/yyy/1/20
の形式のみならず
http://mydomain.com/index.php/xxx/yyy?id=1&user=20

の形式でも送ることができます。この場合GETのパラメータとして受け取る形になりますので、モジュールRequestのメソッドgetGetParams()getGetParam($var_name, $default_value)を利用して

<?
class ctrlXxx extends CZCtrl {

	public function actionYyy() {
		$id = $this->newModule('Request')->getGetParam('id');
		$user = $this->newModule('Request')->getGetParam('user');
			:
	}
		:
}
?>

のように値を取得することになります。

URLの末尾の扱い

Chimpanzeeでは、URLの最後のスラッシュはあってもなくても同じリクエストとして認識します。またURLの末尾にある拡張子を無視します。つまり

以上は同じリクエストになります。したがって拡張子を「.html」として見せたい場合でも、プログラムの実装上は特に意識せず「.html」を付けたものをURLとしてアクセスさせれば結構です。

フロントコントローラ名の省略

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

index.phpのようなフロントコントローラ名を省略して一般的なURLのように

http://mydomain.com/xxx/yyy

としてコントローラxxxのアクションyyyにアクセスさせたい場合、WebサーバのURL書き換え機能(mod_rewrite)を利用して.htaccesshttpd.conf

RewriteEngine On 
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ /index.php [L] 

とすれば、すでに存在するファイルやディレクトリ以外へのアクセスはドキュメントルート直下のindex.phpへ飛ばしてくれます。フロントコントローラがサブディレクトリsubdirにある場合すなわち

http://mydomain.com/subdir/xxx/yyy

でコントローラxxxのアクションyyyにアクセスする場合は

RewriteEngine On 
RewriteBase / 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+) /$1/index.php [L] 

とすることでそのディレクトリにあるindex.phpに飛ばしてくれます。

前後のページ

ページトップへ