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つの方法

  1. autoRenderをtrueにしておく
  2. 明示的にrenderを呼ぶ
  3. autoRenderをfalseにして、returnで出力内容を返す(outputが空のとき)
  4. 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'));
}