連載
» 2007年03月05日 08時00分 UPDATE

「Zend Framework」で加速するPHP開発:第2回 Zend Frameworkの各コンポーネントを一気に制する (1/3)

前回は、Zend Frameworkの概要とその導入方法について説明しました。今回は、各コンポーネントの使用方法について紹介していきます。

[杉田直哉,ITmedia]

 第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へ制御が移ります。

図1 図1 Front Controllerの動作

 利用者が独自に書かなければならないソースコードは次の4種類です。

  1. index.php:どのRouterを使用するかを設定する
  2. Action Controller:各コントローラーにActionメソッドを定義する
  3. Viewクラス:ブラウザ画面に表示される際のレイアウトやロジックを定義する
  4. Modelクラス:データベースアクセスやロジックを処理するモデル層を定義する

index.php:どのRouterを使用するかを設定する

 Zend FrameworkにはPreview 0.1.5リリースの時点で2つのRouterが存在し、どちらを選ぶかでindex.phpの書き方も変わってきます。

簡単に使用できるが自由度の低いZend_Controller_Routerクラス

 デフォルトではZend_Controller_Routerクラスが使用されます。Zend_Controller_Routerクラスは、簡単に使用できて独自に記述するコードが最小限で済みます(リスト1)。ただし、ルーティング定義が固定されており、図2のようにURLの指定方法も固定されてしまいます。


require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('./application/controllers');

リスト1 Zend_Controller_Routerクラスを使うときのindex.php
図2 図2 Zend_Controller_RouterクラスのURL指定方法

 後ろにつけるキーは、Actionメソッド内で変数として取得できます。このURLの解釈で分かるとおり、Zend_Controller_Routerクラスを使用する場合は、DocumentRootにindex.phpが配置されている必要があります。このため、1つのWebサーバでZend Frameworkを使用した複数のアプリケーションをホストしたい場合は、Virtual Hostを設定してアプリケーションごとにホスト名称を用意する必要があります。

柔軟に利用できるがコーディング量の増えるZend_Controller_RewriteRouterクラス

 もう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 Zend_Controller_RewriteRouterクラスを使うときのindex.php

 また、リスト2ではsetRewriteBaseによってルートディレクトリを指定*しています(デフォルトでルートディレクトリを検知するためこの指定は必須ではありません)。注意すべき点としては、Zend_Controller_Routerクラスのように、キーを後ろにつなげるルーティングはサポートされていないことです。このため、Zend_Controller_Routerクラスを使用したアプリケーションをそのままZend_Controller_RewriteRouterクラスへ移行することはできません。現状では、用途に応じて使い分けるのが良いでしょう。

このページで出てきた専門用語

setRewriteBaseによってルートディレクトリを指定

ディレクトリを移動する場合の依存性となるため、このメソッドは指定しないように推奨されている。


       1|2|3 次のページへ

Copyright© 2016 ITmedia, Inc. All Rights Reserved.

Loading

ピックアップコンテンツ

- PR -

注目のテーマ