Ethnaの最近のブログ記事

このようなことはやらない方がよい。
ethna add-action FooBar
ethna add-action fooBar
こうする代わりに、下記のようにすべきである。
ethna add-action foobar

理由

ethna add-action FooBar
↓生成する
app/action/FooBar.php
一方、
ethna add-action foo_bar
↓生成する
app/action/Foo/Bar.php
となる。

一見問題なさそうなのだが、実は両者のクラス名が同じなのである。
どちらも、下記のようなクラスを生成する。
class Project_Form_FooBar
class Project_Action_FooBar
同一プロジェクト内で同じクラス名が2つ存在するのが良くないのは言うまでもない。
また、プロジェクト内でクラス名とファイルパスのマッピングルールが統一されてないと、混乱のもとになる。
Ethna(2.5)でアクションファイルを作るときのファイル名の大文字小文字について、 はまってしまったので調べてみた。

この辺をちゃんと理解していなかったのは私だけではないはずだ。

結論を先に言うと、下記の2つは挙動が異なる。
そして前者を使うべきである。
ethna add-action foo_bar
ethna add-action Foo_Bar

理由

ethnaコマンドでadd-actionをしてみればわかる。

$ ./ethna add-action Foo_Bar

file generated [/home/userdqn/project/skel/skel.action.php -> /home/userdqn/project/app/action/Foo/Bar.php]
action script(s) successfully created [/home/userdqn/project/app/action/Foo/Bar.php]

$ ./ethna add-action bar_buz

file generated [/home/userdqn/project/skel/skel.action.php -> /home/userdqn/project/app/action/Bar/Buz.php]
action script(s) successfully created [/home/userdqn/project/app/action/Bar/Buz.php]
一見、どちらもAaa/Bbb.php形式のファイル名が作られるので同じ挙動のように見えるのだが、実は大きな落とし穴がある。
生成されたアクションクラスファイルのperformメソッドを見てみよう。
add-action Foo_Barした場合
function perform()
{
    return 'Foo_Bar';
}
add-action bar_buzした場合
function perform()
{
    return 'bar_buz';
}
returnの文字列形式が異なっていることがわかる。

一方、add-view -t とadd-templateの挙動を確認してみよう。 

add-view -t Foo_Bar または add-template Foo_Bar とすると、
Foo/Bar.tpl
というファイルが生成される。

add-view -t foo_bar または add-template foo_bar とすると、
foo/bar.tpl
というファイルが生成される。
したがって、下記のようなことをすると正しく遷移できない。
//間違ったやり方 その1
ethna add-action Foo_Bar
した後で
ethna add-view -t foo_bar もしくは ethna add-template foo_bar
//間違ったやり方 その2
ethna add-action foo_bar
した後で
ethna add-view -t Foo_Bar もしくは ethna add-template Foo_Bar
結局、正しく遷移させようとするとfoo_barかFoo_Barかどちらかに統一しないといけない。
//正しいやり方 その1
ethna add-action Foo_Bar
ethna add-view -t Foo_Bar もしくは ethna add-template Foo_Bar

//正しいやり方 その2
ethna add-action foo_bar
ethna add-view -t foo_bar もしくは ethna add-template foo_bar

公式サイトを見る限りでは、"add-action foo_bar"が標準のようである。

まとめ

まとめると、下記のようなファイル名になるのがEthnaの公式仕様と思われる

app/action/Foo/Bar.php
app/view/Foo/Bar.php
template/ja_JP/foo/bar.tpl
あーすっきりした。
Ethnaでは、アクションクラス内でreturn 'user_login' などと書くと、対応するビュークラスを呼び出して画面表示してくれる。

ここで、スペルミスでreturn 'user_loginnn'など存在しないビュー名を書くと、ブラウザの画面が真っ白になることがある。
Ethna初心だった頃の私は、よくこの真っ白画面に出くわして途方にくれた。
何が原因かさっぱりわからず、ビュー名の指定ミスだと気付くまでに数時間かかったりした。
そこで簡単な対処法を紹介します。

Ethna_Controller.phpの1545行目あたりで、
$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
となっている行があります。
この下に、下記のように1行追加してやればOK。
$this->logger->log(LOG_DEBUG, 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name);
trigger_error( sprintf( 'view class is not defined for [%s] -> use default [%s]', $forward_name, $class_name) );
こうすると、 「ビュークラスが見つかりませんでした」的な警告がブラウザに表示されます。

※他にもっと良いやり方があったら教えてください。

自由度が高い

Ruby On Railsのように縛りがきつくないので、自由に自分の規約を作ったり、自作ライブラリと組み合わせて使うことができます。
また、そのような開発スタイルに向いています。

例えばADODBをラップして自作OR/Mapperを作るとか、lime.phpと組み合わせてPerl風のTDD開発をやるとか、そんな楽しみ方があります。
他のフレームワークではなかなか体験できないと思います。

ソースコードが読みやすい

フレームワークを開発している人がみな日本人で、コメントが日本語です。
私のような素人プログラマには、これはものすごく大きい。

また、ファイルやクラスの数が多くないので、印刷して電車の中で読めちゃいます。

あのGreeが使っている

上司や取引先を説得するときに、この一言は強いです。
「あのGree(時価総額1千億円)も使ってるんですよ!」と言えば、経営者層は安心します。
Ruby On RailsとかCakePHPとか言っても、プログラマじゃない人にはピンとこないですから。

覚えることが少ない

一つ目と関係しますが、学習コストが低いです。
個人的な体験ですが、プロジェクトの途中で新しいプログラマが参加してきたとき、1日ペアプログラミングで教えたら、2日目からはその人ひとりで開発できるようになっていました。
(その方がたまたま優秀だったという要因はありますが。)
_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
    );

    // アクション定義の取得
    $action_obj =& $this->_getAction($action_name);

    $this->action_name = $action_name;

    $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);

    // ビュー呼び出し・実行
    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の「背骨」にあたる部分です。

要約版とは言っても、このコードの状態で十分りっぱに機能します。
実際私が携わっている商用Webサイトでは、この状態でも完全に動きます。

さて、_trigger_WWW内で行われていることが、より明確に見えてきましたね。

  • アクションフォームの呼び出し(インスタンス化)、初期化
  • アクションクラスの呼び出し、実行
  • ビュークラスの呼び出し(インスタンス化)、実行
  • プログラム全体の終了

Ehtna_Controllerはこのくらいにして、次回以降、個別のクラスの中をのぞいて見ましょう。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちEthnaカテゴリに属しているものが含まれています。

前のカテゴリはEmacsです。

次のカテゴリはExcelです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

OpenID対応しています OpenIDについて
Powered by Movable Type 5.02