フロントコントローラを利用した場合のZend_Viewの作成
前回までの例にあったように、フロントコントローラを利用してZendを利用する場合、Zend_Viewはどのように使われてきたのでしょうか? Zend Framework入門(5)でも簡単に触れましたが、アクションコントローラのViewRendererヘルパが自動的にZend_Viewのインスタンスを作成していました。この流れを簡単に説明します。
Zend_Viewのインスタンスの作成
まず、Zend_Viewのインスタンスが作成されるまでを説明します。
Zend Framework入門(3):PHPでMVCアプリケーションを構築しようで見たように、フロントコントローラではリクエストの内容を見て、実際の処理を行うアクションコントローラを決定します(ルーティング)。そして、アクションコントローラのインスタンスを作成し、処理を実行させます(ディスパッチ)。
Zend_View関係の処理は、まずこのディスパッチの直前からはじまります。ディスパッチの準備の際に、ViewRendererが使われることがアクションヘルパブローカというオブジェクトに登録されます(図Bの1)。次に、フロントコントローラはアクションコントローラのインスタンスを作成します(図Bの2)。
true
に設定されていると、この登録の処理はされません。つまり、フロントコントローラを使っていても自動的な表示の生成は行われなくなります。 アクションコントローラのインスタンスは、初期化される際にどのようなヘルパを使うべきかをアクションヘルパブローカに問い合わせます(図Bの3)。そして、その指示に基づいてヘルパの登録・初期化を実行します。ViewRenderは初期化される際に、Zend_Viewのインスタンスも作成します(図Bの4)。ViewRendererは、その作成したZend_Viewのインスタンスを、アクションコントローラのメンバ変数$view
に設定します(図Bの5)。
これで、Zend_Viewのインスタンスがアクションコントローラの$this->view
でアクセスできるようになりました。
Zend_Viewによる描画
では、このZend_Viewのインスタンスが実際に描画を行う(すなわちrender
メソッドを実行する)のは、どのタイミングなのでしょう? これは、アクションコントローラの処理が終了した段階で実行されます。
先程までの説明で、アクションコントローラとZend_Viewのインスタンスが作成されました。続いて、フロントコントローラはディスパッチ処理を行います。その際に、リクエストオブジェクトとレスポンスオブジェクトをアクションコントローラに渡します(図Cの1)。このレスポンスオブジェクトが、描画結果を格納するための容器になります。
ディスパッチが実行され、さらにアクションコントーラの処理が一通り終了すると、アクションコントローラに登録されているヘルパのpostDispatch
メソッドが呼び出されます(図Cの2)。その際、ViewRenderer
のpostDispatch
メソッドからZend_Viewのrender
メソッドが呼び出されます(図Cの3)。
ここで、Zend_Viewのインスタンスはビュースクリプトを実行し、描画した結果をViewRendererに返します(図Cの4)。ViewRendererは受け取った結果をレスポンスオブジェクトに格納します(図Cの5)。
実際に描画結果が出力されるのはさらにその後で、フロントコントローラのdispatch
メソッドの最後になります。ここで、レスポンスオブジェクトのsendResponse
メソッドが呼び出されます(図Cの6)。標準では、これはHTTPへのレスポンスとして出力されます。
Zend_Viewのパラメータ
ここで一旦、Zend_Viewの挙動を決めるパラメータをいくつか紹介しておきます:
パラメータ | 内容 |
basePath | ビュースクリプト、ビューヘルパとビューフィルタの置かれているパス。 |
encoding | エスケープ処理などで使われる文字コード。標準ではISO-8859-1に設定されている。 |
escape | エスケープ処理を行うコールバック関数。標準ではhtmlspecialcharsに設定 |
filter | ビュースクリプトを呼び出した後に呼ばれるフィルタ。 |
strictVars | 初期化されていない変数が参照されたときに、警告を表示するかどうかの設定。 |
これらについては、これから順番に説明していきます。