CakePHPのレンダリング処理(render)
CakePHP1.2、viewのレンダリング処理部分についてのメモ。
Controller::render()
viewを解釈して、結果をoutputプロパティに文字列として格納するメソッド。
戻り値としてレンダリング結果を返す。実際の出力まではやらない。
複数回呼び出すと、出力内容は上書きされるのではなく追加されていく。
一度renderを呼び出すとautoRenderはfalseとなる。
<?php class Controller extends Object { function render($action = null, $layout = null, $file = null) { // 略(処理準備) $this->autoRender = false; // Viewのrenderが実際の処理を行う // 結果は追加されていく $this->output .= $View->render($action, $layout, $file); // レンダリング結果を返す return $this->output; } }
Dispatcher::_invoke()
コントローラのアクションを実行して、レンダリング結果を出力するメソッド。
beforeFilter、afterFilterなどもここで呼ばれる。
autoRenderがtrueの場合には、renderメソッドを実行して戻り値をoutputプロパティに格納する。(追加ではなく上書きするのに注意)
outputプロパティが空の場合には、actionの戻り値をoutputプロパティに格納する。
<?php class Dispatcher extends Object { function _invoke(&$controller, $params) { $controller->constructClasses(); $controller->Component->initialize($controller); $controller->beforeFilter(); $controller->Component->startup($controller); // 略 // アクションを実行 $output = $controller->dispatchMethod($params['action'], $params['pass']); if ($controller->autoRender) { // autoRenderがtrueの場合、renderの戻り値を出力内容とする $controller->output = $controller->render(); } elseif (empty($controller->output)) { // outputプロパティが空の場合、アクションの戻り値を出力内容とする $controller->output = $output; } $controller->Component->shutdown($controller); $controller->afterFilter(); // 略 // 出力する echo($controller->output); } }
レンダリング4つの方法
- autoRenderをtrueにしておく
- 明示的にrenderを呼ぶ
- autoRenderをfalseにして、returnで出力内容を返す(outputが空のとき)
- autoRenderをfalseにして、outputに直接出力内容を格納する
<?php class FooController extends AppController { function action1() { $this->autoRender = true; // 省略可 } function action2() { $this->render('foo'); } function action3() { $this->autoRender = false; $this->output = null; // 省略可 return '出力したい内容'; } function action4() { $this->autoRender = false; $this->output = '出力したい内容'; } }
renderの結果を文字列として取得する
renderの結果を文字列として取得するが、出力はしない方法。
render呼び出し後outputを空にする。必要に応じてautoRenderをtrueに戻す。
<?php function action() { $output = $this->render('foo'); // 出力内容を文字列で取得 $this->output = null; // outputを空にする $this->autoRender = true; // trueに戻す }
Object::requestAction()のoptionにreturnを設定すると、
特定のactionのレンダリング結果を取得することもできる。
<?php function action() { $output = $this->requestAction('/bar/baz', array('return')); }