Ethnaのソースコードを読み解く 第4回 Sample_Controller::trigger

前回の続きより。
Ethna_Controller.php

    function main('Sample_Controller', 'index', "")
    {
        $c =& new Sample_Controller;
        $c->trigger('index',  "");
    }
$c には、Sample_Controllerクラスのオブジェクトが入ります。
(オブジェクトが何かわからない人は、「データ」だと思ってください。オブジェクト=「関数付きデータ」です。)

$c->trigger()で、Sample_Controllerのtrigger関数(メソッド)が実行されます。

では、Sample_Controller.phpを開いて、trigger関数を探しましょう。

ない。

ということは、Ethna_Controllerのtrigger関数が( $cのメソッドとして )呼ばれるはずです。

Ethna_Controller::triggerは・・・あった。
    function trigger($default_action_name = "", $fallback_action_name = "", $enable_filter = true)
    {
        // フィルターの生成
        if ($enable_filter) {
            $this->_createFilterChain();
        }

        // 実行前フィルタ
        for ($i = 0; $i < count($this->filter_chain); $i++) {
            $r = $this->filter_chain[$i]->preFilter();
            if (Ethna::isError($r)) {
                return $r;
            }
        }

        // trigger
        switch ($this->getGateway()) {
        case GATEWAY_WWW:
            $this->_trigger_WWW($default_action_name, $fallback_action_name);
            break;
        case GATEWAY_CLI:
            $this->_trigger_CLI($default_action_name);
            break;
        case GATEWAY_XMLRPC:
            $this->_trigger_XMLRPC();
            break;
        case GATEWAY_SOAP:
            $this->_trigger_SOAP();
            break;
        }

        // 実行後フィルタ
        for ($i = count($this->filter_chain) - 1; $i >= 0; $i--) {
            $r = $this->filter_chain[$i]->postFilter();
            if (Ethna::isError($r)) {
                return $r;
            }
        }
    }
むむむ。。ちょっと長いですね。
私のようなへっぽこプログラマは、長い関数を見ると尻込みしてしまいます。

つづく
カテゴリ: