Action Controllerは、Zend_Controller_Actionクラスを継承したクラスである必要があります。また、Action Controller内には、「Action名称+"Action"」という名前でメソッドを定義しなければいけません。Indexアクションの場合は、IndexActionメソッドとなります。これらはRouterにかかわらず同一です。Action Controllerの簡単なサンプルコードをリスト3に示しましょう。
<?php
require_once 'Zend/Controller/Action.php';
require_once 'Zend/View.php';
// コントローラーに定義されていないアクションが呼ばれた場合に処理が行われるハンドラ
class IndexController extends Zend_Controller_Action {
public function __call($action, $arguments) {
global $config;
$this->_redirect('/Blog/Index');
}
// Indexアクション(〜Actionの命名規則が存在する)
public function indexAction() {
global $config;
$this->_redirect('/Blog/Index/');
}
// ルーティング定義が見つからなかった場合はZend_Controller_Router_Exceptionが発生し、IndexController.phpのnoRouteアクションが呼ばれる
public function noRouteAction() {
header('HTTP/1.1 404 Not found');
$view = new Zend_View();
$view->setScriptPath('../application/views');
$view->pageTitle = '404 error';
echo $view->render('Pages/ServicePages/404.php');
}
}
?>
Zend Frameworkには、「Zend_View」というHTMLレンダリング用のコンポーネントが備わっています。ビューに関しては、Smartyなど既存のテンプレートエンジンも使用可能です。どこまでZend_Viewの機能に頼るかは、次のような選択肢の中から選ぶことができます。
マニュアルには1の方法が例示されていますが、Viewコンポーネントの中で、さらにHTMLとプレゼンテーションロジックを分離するため、必要以上にコードが冗長になってしまう恐れがあります。1ページ単位の情報量が多く、規模も大きいWebサイトを作成する場合には適切ですが、そうでない場合は避けた方が良いでしょう。特に1のような書き方にこだわりがなく、コード量も少なくて済む場合には4を、すでに慣れ親しんだテンプレートエンジンがある場合は3を選べば良いでしょう。
なお、「RSSやJSONのデータを発信するサーバの役目を担うAction」といったように、結果がHTMLとならない場合には5を選択するのが妥当です。2の方法を取れば使いやすいViewコンポーネントを独自に開発することも可能ですが、互いの依存性が高まってしまいます。
Zend_Viewは、大まかにコントローラースクリプトとビュースクリプトに分かれます。ここでのコントローラースクリプトは、「Actionメソッド内などコントローラー処理の最後でビュースクリプトを読み込むために定義する記述」を指します。ビュースクリプトは、それを受けて引き渡される変数とともにレンダリングされます。HTMLの記述は通常、ビュースクリプトに記述されます。
コントローラースクリプトでは、必要に応じて次の処理を記述します。
$view = new Zend_View();
「$view->a = $a」のように、直接代入する方法もありますが、「$view->assin($array)」のように配列をまとめて代入することも可能です。オブジェクトの場合は配列にキャストして渡します。
$view->a = $a;
$view->assin($array);
デフォルトでは、ビュースクリプトを読み込むコントローラークラスの存在するディレクトリが検索されます。保管ディレクトリをべつべつに分けている場合は、次のようにビュースクリプトが保管されているディレクトリを指定する必要があります。
$view->setScriptPath('/path/to/app/views');
Zend_Viewでは、よく使用するHTML要素をレンダリングする関数として、ヘルパーが用意されています。HTMLフォーム要素のヘルパークラスがZend_Viewに付属しており、デフォルトで使用可能になっています。
ここでは独自にヘルパークラスを作成した場合に、そのヘルパークラスが保管されるディレクトリへのパスを設定することで、同様にヘルパーとして使用することを可能にします(特に使用しない場合は設定する必要はありません)。
$view->setHelperPath('/path/to/more/helpers');
ビュースクリプト内で使用できるescapeの関数を指定します。ビュースクリプト内で「echo $this->escape($this->variable);」のように記述しておけば、エスケープに使用される関数を一括して切り替えられるなど、管理が容易になります。デフォルトではhtmlspecialcharsが設定されており、「<」や「>」などHTMLにおいて特殊な意味を持つ文字はエスケープされます。
$view->setEscape('htmlentities');
上記で指定したパス上のビュースクリプトファイルを指定して、レンダリングを行います。
echo $view->render(...);
Zend/Viewディレクトリ以下にはFilterディレクトリが存在し、ヘルパーと同様にZend_Viewのインスタンスに対してフィルタを登録可能です。Filterディレクトリには付属するクラスが存在しないので、使用する場合はすべてカスタマイズ作成する必要があります。ビュースクリプトにおいて使用した場合には、指定した文字列に対してディレクトリに保管されているフィルタクラスのfilter()メソッドの処理がすべて適用されます。
ビュースクリプトでは、HTMLを交えたPHPコードと同じように、コントローラースクリプトで引き渡された変数と設定されたヘルパー、エスケープなどの処理を交えて、最終的にレンダリングされるHTMLレイアウトを構成します。引き渡された変数やassign関数で設定された配列は「$this->books」のようにアクセスします(リスト4)。
<?php if ($this->books): ?>
<!--本の一覧-->
<table>
<tr>
<th>著者</th>
<th>タイトル</th>
</tr>
<?php foreach ($this->books as $key => $val): ?>
<tr>
<td><?php echo $this->escape($val['author']) ?></td>
<td><?php echo $this->escape($val['title']) ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php else: ?>
<p>表示する本がありません。</p>
<?php endif; ?>
Copyright © ITmedia, Inc. All Rights Reserved.