Ethnaのソースコードを読み解く 第6回 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()を詳しく見ていきましょう。
      カテゴリ:
      
      Ethna