Ethnaのソースコードを読み解く 第6回 Ethna_Controller::_trigger_WWW

Ethna_Controller::_trigger_WWW



function _trigger_WWW($default_action_name = "", $fallback_action_name = "")
{
    // アクション名の取得
    $action_name = $this->_getActionName($default_action_name, $fallback_action_name);

    // マネージャ実行チェック
    $this->_ethnaManagerEnabledCheck($action_name);

    // アクション定義の取得
    $action_obj =& $this->_getAction($action_name);
    if (is_null($action_obj)) {
        if ($fallback_action_name != "") {
            $this->logger->log(LOG_DEBUG, 'undefined action [%s] -> try fallback action [%s]', $action_name, $fallback_action_name);
            $action_obj =& $this->_getAction($fallback_action_name);
        }
        if (is_null($action_obj)) {
            return Ethna::raiseError("undefined action [%s]", E_APP_UNDEFINED_ACTION, $action_name);
        } else {
            $action_name = $fallback_action_name;
        }
    }

    // アクション実行前フィルタ
    for ($i = 0; $i < count($this->filter_chain); $i++) {
        $r = $this->filter_chain[$i]->preActionFilter($action_name);
        if ($r != null) {
            $this->logger->log(LOG_DEBUG, 'action [%s] -> [%s] by %s', $action_name, $r, get_class($this->filter_chain[$i]));
            $action_name = $r;
        }
    }
    $this->action_name = $action_name;

    // 言語設定
    $this->_setLanguage($this->language, $this->system_encoding, $this->client_encoding);

    // オブジェクト生成
    $backend =& $this->getBackend();

    $form_name = $this->getActionFormName($action_name);
    $this->action_form =& new $form_name($this);
    $this->action_form->setFormVars();

    // バックエンド処理実行
    $backend->setActionForm($this->action_form);

    $session =& $this->getSession();
    $session->restore();
    $forward_name = $backend->perform($action_name);

    // アクション実行後フィルタ
    for ($i = count($this->filter_chain) - 1; $i >= 0; $i--) {
        $r = $this->filter_chain[$i]->postActionFilter($action_name, $forward_name);
        if ($r != null) {
            $this->logger->log(LOG_DEBUG, 'forward [%s] -> [%s] by %s', $forward_name, $r, get_class($this->filter_chain[$i]));
            $forward_name = $r;
        }
    }

    // コントローラで遷移先を決定する(オプション)
    $forward_name = $this->_sortForward($action_name, $forward_name);

    if ($forward_name != null) {
        $view_class_name = $this->getViewClassName($forward_name);
        $this->view =& new $view_class_name($backend, $forward_name, $this->_getForwardPath($forward_name));
        $this->view->preforward();
        $this->view->forward();
    }

    return 0;
}


この関数こそがEthnaのメイン処理の部分です。
Ethnaのプログラムの流れがすべてここに凝縮されています。

ここでは、次のような重要なことが行われています。
  • アクションフォームの呼び出し(インスタンス化)
  • アクションクラスの呼び出し(インスタンス化)
  • ビュークラスの呼び出し(インスタンス化)
  • プログラム全体の終了

ここを読み解けば、Ethnaの全体像を把握することができます。
Ethnaで作ったアプリが動かないときは、ここでecho('hello')とか仕込んでおけば、プログラムがどこまで実行されたかわかります。

なお、この関数は最後に0を返しますが、この0はどこにも行きません。
呼び出し元のtrigger()関数のなかで空しく捨てられます。
そしてプログラム全体が終了します。

まとめると、

Ethnaのプログラム実行処理は、index.phpから始まって、trigger()で終わる。

と言えます。
そしてほとんどの処理は_trigger_WWW()の中で行われています。

次回以降、この_trigger_WWW()を詳しく見ていきましょう。
カテゴリ: