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