Alex@Net Blogは、Routerとして「Zend_Controller_Router」を使用しています。そのため、「http://ホスト名/コントローラ名/アクション名」としてURIが解釈され、index.phpにrewriteされます(図2)。また、httpd.confで設定しているDocumentRoot直下にindex.phpを配置する必要があります。
フロントコントローラはリスト2のようになっています。処理の内容を見てみましょう。
set_include_path('./_/library/');
require_once 'config.php';
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('./_/application/controllers');
まず、set_include_pathには、Alex@Net Blogのディレクトリツリー内部にあるZend Frameworkのディレクトリが指定されています。アクセスのたびにindex.phpの処理が行われるので、Zend Frameworkは、必ずPHPのinclude_pathに入るようになります。
次に、require_onceで、アプリケーションの設定が記述されているconfig.phpを読み込みます。config.php内にConfigクラスが定義され、ディスパッチ先のコントローラでオブジェクトとして扱われます。また、その次で、フロントコントローラとなるFront.phpも読み込まれています。
最後に、Zend_Controller_Front::runでルーティングとディスパッチが行われます。このときのrunメソッドに指定されている引数は、アクションコントローラを置いてあるディレクトリです。ディスパッチの際に、該当するアクションが存在するかどうか調べるので、そのためにディレクトリを引数として指定するのです。
このルーティングは、Zend_Controller_RewriteRouterで表現するとリスト3のようになります。こちらの方がより冗長な記述になっていますが、複数のルーティングパターンを設定可能など、柔軟な制御が行えます。
$router = new Zend_Controller_RewriteRouter();
$router->addRoute('user', ':controller/:action', array('controller' => 'Index', 'action' => 'Index'));
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);
$ctrl->setControllerDirectory('./application/controllers')->dispatch();
Copyright © ITmedia, Inc. All Rights Reserved.