Ethnaの最近のブログ記事

Ethna2.6 beta3がリリースされたので、前回のbeta2からの差分を調査してみました。

ざっと見た感じでは、アクセス修飾子(public,protected,private)が付いたのが一番大きいと思います。

これまでvar $fooとか function foo()とかのように事実上publicだったものが、protectedとかprivateになっているケースが結構あります。
バージョンアップする際は要注意です。

比較コマンド
 diff Ethna-2.6.2011010402 Ethna-2.6.0beta2011102522  -r -b -w -B  -U 1 | grep -v "\$Id"
MyEthnaというソフトウェアパッケージを作りました。

MyEthnaというのは、EthnaとSmarty2とプロジェクトスケルトンが同梱されたパッケージ(tar.gzファイル)です。

(先ほどリリースされたばかりのEthna 2.6.0beta3が元になっています。)

解凍するだけですぐに開発を始めることができます。

ダウンロード
MyEthna-2.6.0beta3.tar.gz

使い方

cd ~
wget http://dqn.sakusakutto.jp/files/images/MyEthna-2.6.0beta3.tar.gz
tar xvfz MyEthna-2.6.0beta3.tar.gz
chmod 0777 MyEthna/tmp  MyEthna/log
mv MyEthna /tmp
ln -s  /tmp/MyEthna/www   /var/www/html/My
これだけです。
ブラウザから、
http://hogehoge.com/My/
などとしてアクセスしてみてください。

Hello Worldが表示されたら成功です。

ぜひお試しください!
そして感想を書いてもらえると幸いです。

MyEthnaのメリット

  • Smarty2がインストール済みです。
  • プロジェクトが生成済みなので、add-projectコマンドを実行する必要がありません。("add-project My"を実行済み)

これを作ったきっかけ

Ethnaユーザの裾野を広げたいと思ってつくりました。

http://sourceforge.jp/ticket/browse.php?group_id=1343&tid=15931
Ethna本体の単体テストは、Smartyへのパスがちゃんと通っていないと正しく動きません。
Ethnaで携帯サイトを構築する際には、Ethna_SessionがIPアドレスチェックするのを無効にする必要があります。
新しいレポジトリの場所はこちらです。

https://github.com/ethna/ethna

現在Ethna2.6リリースに向けて鋭意開発中です。(@sotarokさんが)
Ethna2.5.0, Ethna2.6betaで発生します。

問題

Ethna2.5.0から、アクションフォームでsetFormDef_PreHelper()というのが使えるようになりました。

ところが一つ問題があります。
"Ethna"というPHPのフレームワークについて、開発するときに役立つ10個の知識をまとめてみました。
PHPプログラマの皆さんこんにちわ。
フレームワーク使いこなしてますか?

このたび、フレームワーク初心者のために簡単なサンプルアプリケーションを作ったので公開します。

名付けて、Yukiwikimini On Ethna


(YukiwikiminiをEthna上で動くPHPアプリとして移植しただけです)

Ethna_DBの比較

Ethna_Filterの比較

Ethna_CacheManagerの比較

Ethna_ActionClassの比較

↓比較コマンドとその結果

まずはEthna.phpをアップグレード

Ethna.phpはアップグレードしても問題なさそうだ。

Ethna2.6からは、クラスファイルの命名規則が変わっている(Ethna_ActionClass.php → ActionClass.php)ので、ファイル名をリネームする必要がある。
なんでこんな比較文献学みたいなことをやってるかと言うと、version2.5をすっ飛ばして一気に2世代分もバージョンを上げるのが怖いからです。(←ビビり)

Ethna.phpの比較


2.3.5のEthna.phpをUTF8で保存してから、バージョン間の差分を見てみる。
ソースコードを展開して、中身を比較してみる。
ソースの入手方法は、
Ethna2.6は前回の記事を参照。
Ethna2.3.5は公式サイトに入手方法が書いてないけど、sourceforgeからダウンロードできる。
wgetで取得するならこう。
$ wget "http://sourceforge.jp/projects/ethna/svn/view/ethna/tags/ETHNA_2_3_5.tar.gz?root=ethna&view=tar"

Ethna2.3.5とEthna2.6のディレクトリ構造を比較する

まずはトップレベルディレクトリを比較する。
$ ls ETHNA_2_3_5
CHANGES  Ethna.php  LICENSE  README  bin/  class/  misc/  skel/  test/  tpl/

$ ls Ethna-2.6.2011010402
CHANGES  Ethna.php  LICENSE  README  bin/  class/  extlib/  skel/  test/  tpl/
Ethna2.6ではextlibが増えたみたい。
中身はこんなの。

 extlib
  `-- Plugin
      |-- Filter
      |   `-- Debugtoolbar.php
      `-- Logwriter
          `-- Debugtoolbar.php
とりあえずは無視しても問題なさそうだ。

次回は、Ethna.phpを比較してみる。
仕事で開発しているWebサイトはEthna2.3.5なので、E_STRICTやPHP5.3を使うことができない。

PHP5.1とか5.2だと、配列の操作で無名関数を使うコードを書きにくいので、foreachループばかり使ってしまう。
結果、なんとなくダサイコードになる。

いい加減モダンPHPを使いたくなってきたので、EthnaアプリをPHP5.3対応させる方法を調べてみた。

まずはEthna公式サイトの最新ニュースを見る。

Ethna 2.6.0 beta 2 リリース (2011/1/4)
beta1 に引き続き、開発版のリリースです。
beta1 のバグフィックスと、Smarty 3 用のRendererの追加をしました。

Ethna 2.6.0 beta 1 リリース (2010/12/27)
Ethna 2.5.0 から PHP 5.3 でエラーとなる機能を修正し、2.5.0 preview 5以降に変更を予定されていた機能を盛り込んだ 2.6.0 の開発バージョンをリリースします。(このため、PHP 4 に対しては後方互換性を失います)
なるほど、Ethna2.6.0にすればPHP5.3対応できるのか。
このようなことはやらない方がよい。
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) );
こうすると、 「ビュークラスが見つかりませんでした」的な警告がブラウザに表示されます。

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

Ethnaの魅力を語る

自由度が高い

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

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

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

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

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

あのGreeが使っている

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

覚えることが少ない

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

人気記事

このアーカイブについて

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

前のカテゴリはPHPです。

次のカテゴリはLinuxです。

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

最近の人気記事