Wadslog

[Zend Framework] Zend_Controllerでの基本的なフロントコントローラ

Mar 13, 2008

Zend_Controllerでフロントコントローラ(Zend_Controller_Front)は以下のような役割を果たします。

  • リクエストを適切なActionControllerへ引き渡す
  • レスポンスの内容を取得して、リクエスト元へ返す

Zend_Controllerでの基本的なフロントコントローラの作り方について書きます。 ○インスタンスの生成 Zend_Controller_Frontはシングルトンパターンも実装しているので、常に1つのインスタンスしか生成できません。つまり、newはできません(コンストラクタはprivateになっています)。またオブジェクトのハードコピーも出来ません(__clone()もprivateになってます)。 インスタンスの生成にはstaticメソッドのgetInstance()を使用します。``` /* インスタンス生成 */ // できる例 $front = Zend_Controller_Front::getInstance();

// できない例// $front = new Zend_Controller_Front;

/* オブジェクトのコピー */ // できる例 $copy = $front; // 参照先(オブジェクトのあるアドレス)をコピー

// できない例 $copy = clone $front; // ハードコピー(オブジェクトそのものがコピーされる) **○コントローラディレクトリの設定** フロントコントローラを動作させるためには、コントローラのあるディレクトリへのパスを最低ひとつ設定しないといけません。設定にはsetControllerDirectory()またはaddControllerDirectory()を使用します。 // デフォルト(default)モジュールのコントローラディレクトリを設定 $front->addControllerDirectory(‘path/to/the/controller’);

// もしくは $front->setControllerDirectory(‘path/to/the/controller’);

// ‘blog’モジュールのコントローラディレクトリを設定 $front->addControllerDirectory(‘path/to/controller’, ‘blog’);

// もしくは $front->setControllerDirectory(‘path/to/controller’, ‘blog’);

// 複数のモジュールを設定 $front->setControllerDirectory(array( ‘default’ => ‘path/to/controller’, ‘blog’ => ‘path/to/blog-module/controller’ ));

// こんなのも可能です $front->addControllerDirectory(‘path/to/controller’) ->addControllerDirectory(‘path/to/blog-module/controller’, ‘blog’);


*   ViewRendererとErrorHandlerの生成(有効にするという設定の場合)
*   Request/Responオブジェクトの生成(デフォルトはZend\_Controller\_Request\_Http.phpZend\_Controller\_Response\_Http.php)
*   ルーター/ディスパッチャーの初期化
*   ディスパッチ処理
*   レスポンスを返す

ここまでで述べた、

*   Zend\_Controller\_Frontインスタンス生成
*   コントローラディレクトリの設定
*   ディスパッチ処理

がフロントコントローラで行う必要のある最低限の処理です。実はrunというstaticメソッドでこれをすべてやってくれます。引数でコントローラディレクトリを指定するだけでOKです。```
Zend\_Controller\_Front::run('path/to/controllers');
```runの内容は以下のようになってます```
public static function run($controllerDirectory) { 
    self::getInstance() 
        ->setControllerDirectory($controllerDirectory) 
        ->dispatch(); 
}
```**○レスポンスオブジェクトの受け取り** デフォルトではdispatch()のあと自動的にレスポンスをレンダリングしますが、returnResponse()にtrueを設定することで、dispach()の処理が終わったあとにレスポンスオブジェクトを取得することができます。 こうすることで、たとえば、レスポンスオブジェクトを受け取ったあとでisException()で処理すべき例外を調べて、必要あれば例外の処理を行うなどできます。 通常のdispatch()```
// 通常はdispath()の最後でレスポンスオブジェクト 
//(デフォルトはZend\_Controller\_Response\_Http)の 
// sendResponse()でレンダリングを行います; 
$front->dispatch();
```returnResponse()にtrueを設定```
// returnResponse()にtrueを設定すると 
// dispatch()でレスポンスオブジェクト 
// が返り、例外処理などできます 
$front->returnResponse(true); 
$response = $front->dispatch(); 
if ($response->isException()) { 
    $exceptions = $response->getException(); 
    // 例外処理 
    
    // エラー画面の表示など 
} else { 
    // レスポンスのレンダリング 
    // sendResponse()と同等の処理 
    $response->sendHeaders(); 
    $response->outputBody(); 
}
```dispatch()の処理中に発生した例外は、デフォルトではレスポンスオブジェクトに次々に格納されますが、throwExceptions()にtrueを設定すると、レスポンスオブジェクトに格納せず例外をスローします。```
$front->throwExceptions(true); 
try { 
    $front->dispatch(); 
} catch (Exception $e) { 
    // 例外処理 
}
```ここまでをまとめて、基本的な機能をもったフロントコントローラはこんな感じになると思います。```
< ?php 
require\_once 'Zend/Controller/Front.php';    

$front = Zend\_Controller\_Front::getInstance();    

$front->setControllerDirectory('path/to/the/controller');    

$front->returnResponse(true); 
$response = $front->dispatch(); 
if ($response->isException()) { 
    $exceptions = $response->getException(); 
    // 例外処理 
    
    // エラー画面の表示など 
} else { 
    /\* レスポンスのレンダリング \*/ 
    $response->sendHeaders(); 
    $response->outputBody(); 
}
comments powered by Disqus