前回は、Zend Frameworkの概要とその導入方法について説明しました。今回は、各コンポーネントの使用方法について紹介していきます。
第1回となる前回では、Zend Frameworkの概要を説明した後、Zend Frameworkの導入方法について説明しました。今回は、各コンポーネントの使用方法について紹介していきます。
さて、ここまででZend FrameworkのMVCモデルを使用する準備は整いました。ここからは、各コンポーネントの使用方法を説明しますが、その前にZend FrameworkのFront Controllerの動作をもう一度まとめておきましょう(図1)。まず、ブラウザで指定されるURLはmod_rewriteの機能によってindex.phpのアクセスへrewriteされます。index.phpではZend_Controller_Frontクラスを読み込み、このクラスがRouterとなるクラスとDispatcherとなるクラスへ振り分けます。指定されたURLは、Routerによって「どのAction ControllerのどのActionを呼び出す」という情報に解釈されて、Zend_Controller_Dispatcher_Tokenにまとめられます。これをDispatcherが受け取り、該当のActionへ制御が移ります。
利用者が独自に書かなければならないソースコードは次の4種類です。
Zend FrameworkにはPreview 0.1.5リリースの時点で2つのRouterが存在し、どちらを選ぶかでindex.phpの書き方も変わってきます。
デフォルトではZend_Controller_Routerクラスが使用されます。Zend_Controller_Routerクラスは、簡単に使用できて独自に記述するコードが最小限で済みます(リスト1)。ただし、ルーティング定義が固定されており、図2のようにURLの指定方法も固定されてしまいます。
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('./application/controllers');
後ろにつけるキーは、Actionメソッド内で変数として取得できます。このURLの解釈で分かるとおり、Zend_Controller_Routerクラスを使用する場合は、DocumentRootにindex.phpが配置されている必要があります。このため、1つのWebサーバでZend Frameworkを使用した複数のアプリケーションをホストしたい場合は、Virtual Hostを設定してアプリケーションごとにホスト名称を用意する必要があります。
もう1つのRouterとしてZend_Controller_RewriteRouterクラスが用意されています。こちらのRouterは自由にルーティング制御を定義できる半面、コーディング量が増えます。 例えば、Zend_Controller_Routerクラスと同様のルーティングをしたい場合、リスト2のように記述します。Zend_Controller_RewriteRouterでは、定義したいルートごとにaddRouteメソッドを使用して設定し、リスト2は「:controller/:action」のルートを設定しています。先頭に「:」をつけることで変数として解釈されますが、「:controller」と「:action」は予約語として定義されており、そのままAction ControllerとActionメソッドの名称として解釈されます。
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/RewriteRouter.php';
$router = new Zend_Controller_RewriteRouter();
$router->setRewriteBase("C:\www\blog");
$router->addRoute('user', ':controller/:action', array('controller' => 'Main', 'action' => 'Index'));
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);
$ctrl->setControllerDirectory('./application/controllers')->dispatch();
また、リスト2ではsetRewriteBaseによってルートディレクトリを指定*しています(デフォルトでルートディレクトリを検知するためこの指定は必須ではありません)。注意すべき点としては、Zend_Controller_Routerクラスのように、キーを後ろにつなげるルーティングはサポートされていないことです。このため、Zend_Controller_Routerクラスを使用したアプリケーションをそのままZend_Controller_RewriteRouterクラスへ移行することはできません。現状では、用途に応じて使い分けるのが良いでしょう。
ディレクトリを移動する場合の依存性となるため、このメソッドは指定しないように推奨されている。
Copyright © ITmedia, Inc. All Rights Reserved.