[ethna-users:0007] Re: ドキュメントに書かれていない機能

Masaki Fujimoto masaki-f @ eth.jp
2005年 3月 4日 (金) 18:46:56 JST


ふじもとです。

The Message From halt on Fri, 4 Mar 2005 13:35:11 +0900:
-snip-
> >といった基本機能をベースに、オプションとして
> >
> >    * ログ出力機能(file/syslog)
> >    * アラート機能
> >    * エラー処理フレームワーク
> >    * O/Rマッピングオブジェクト
> >
> >等のアプリケーション構築をより効率的に進めるための機能を提供します
> 
> と書かれていて、基本機能についてはドキュメントが整備されているため
> 理解できるのですが、これらのオプションの機能について理解されている
> 方は少ないのではないでしょうか?

えーと。

おっしゃるとおりです。まだ存在することすら書いてない機能もちょこちょこ
ありますし...。基本的には、ぼくがウェブアプリケーションを書いていてめ
んどいー、と思ったところを何とかしていっている、という感じなので、細か
くてundocumentedな機能とかが有ったりしちゃうんですよねー、すみません。

なので、「こーいう処理、よくありそうだけど、どうしてる?」というご質問
は大歓迎でございます。

> 個人的には解析の糸口のなるようなメモ書き程度でもあれば嬉しいのです
> が、、

ですね!(汗

> 私は今Ethnaの上でDB_DataObjectを使っているのですが
> [app-id]-ini.php上で設定を読み込んで、
> 各Actionの上で
> 
> $Table = DB_DataObject::factory('table');
> 
> して、オブジェクトを生成しています。
> もうちょっとControllerと連携した感じにできたらいいなと思うのですが
> うまいやりかたが思い付きません。
> (DB_DataObjectなら、ActionFormとの連携ができそうな気がするのになぁ)
> 
> これが「O/Rマッピングオブジェクト」のオプションでもっとすっきりするのかなぁとか、、

うーん、DB_DataObjectに関しては特に「すばらしい!」というやり方はない
ですかねー。Mojavi的にFilterにいろいろ書く、あるいはEthna_Backendを継
承して...とかでしょうか?っていうかすいません、DB_DataObjectを良く知ら
ないので。

で、(似非)O/Rマッピング機能を提供しているのがEthna_AppObjectで、まだ機
能は完全ではありませんが僕はこれで生きています。これもドキュメントを書
かなくちゃいけないんですが、めんどくて...orz

あるいはサンプルがあればよいのですが、ちょっと外にだせるソースコードが
今ないんですよねー。これは近いうちに何か出せればよいかな、と思っていま
す。

#「近いうち」っていつだ、っていう話ですが:)

とりあえず、一番単純な使い方を...:

(1) DB設定

Randolph @ IRCが書いてくださった:

http://ethna.jp/ethna-db.html

みたいな感じでDSNを設定します

(2) AppObject

こんな感じで、Ethna_AppObjectを継承したクラスを書きます。

class Sample_User extends Ethna_AppObject
{
    /**#@+
     *  @access private
     */
    /**
     *  @var    array   テーブル定義
     */
    var $table_def = array(
        'user_tbl' => array(
            'primary' => true,
        ),
    );

    /**
     *  @var    array   プロパティ定義
     */
    var $prop_def = array(
        // user_tbl
        'user_id' => array(
            'primary' => true, 'key' => true, 'seq' => true,
            'type' => VAR_TYPE_INT, 'form_name' => 'user_id',
        ),
        'name' => array(
            'primary' => false, 'key' => false, 'type' => VAR_TYPE_STRING,
            'form_name' => 'user_name',
        ),
    );
    /**#@-*/
}

$table_defメンバにはそのAppObjectと対応するDB上のテーブル名を指定しま
す。現在はJOINにはほとんど対応していないので、記述可能なテーブルは常に
1つで、'primary'も常にtrueです。

$prop_defメンバには、フィールド定義を記述します。今のところ、スキーマ
の自動取得は対応していません(有った方がいいですかねー?)。

'フィールド名' => array(プロパティ...)

という形での記述になります。プロパティは:

primary: そのフィールドがプライマリキーならtrueとします
key: そのフィールドがプライマリキー、あるいはuniqueならtrueとします
seq: そのフィールドが(MySQL的に言うと)AUTO_INCREMENTである場合はtrueと
します
type: 今のところ基本的に使っていませんので、VAR_TYPE_INTか
VAR_TYPE_STRINGを適当に指定してください
form_name: そのフィールドに対応する値がウェブから送信される場合のフ
ォーム名を指定します

という感じです。form_nameはイマイチ意味が分かりにくいですが、例えば管
理画面等のアクションを書いているとして、

$user =& new Sample_User($this->backend);
$user->importForm();

とすると、form_nameに指定されたフォーム名に対応するフォーム値を自動的
にプロパティにセットしてくれます。僕が手抜きしたいがために作ったメソッ
ドで、要するに

$user->set('name', $this->af->get('user_name'));
$user->set('pref', $this->af->get('user_pref'));
...

とか延々と書くのも頭悪いよね、ということで...。


(3) 使い方

話が前後しましたが、簡単な使い方は以下のようになります。

[通常の場合]
$user =& new Sms_User($this->backend, 'user_id', $user_id);

として、第2引数にオブジェクトを特定するためのフィールド名、第3引数にそ
の値を指定します。

で、

$user->get('name');

とするとプロパティを取得できます。

$user->set('name', 'foo');

で、プロパティの更新です(当然)。

でもって、

$user->update();

とするとDBを更新できます。

$user->remove();

とすると削除です。


[追加する場合]
新しくDBにエントリを追加する場合は以下のようになります。

// 引数を省略してnew
$user =& new Sample_User($this->backend);

$user->set('user_name', 'foo');
$r = $user->add();
if (Ethna::isError($r)) {
    //...
}
$id = $user->getId();

プライマリキーのseqフィールドがtrueならプライマリキーのプロパティは設
定しなくてOKです。

[その他]

$user->getName('user_name');

というメソッドもあります。これはプロパティ値と、表示用の値が違う場合
(「県」等)に、オーバーライドしてその表示用の値を返す形で利用します。
つまり

$user->get('user_pref');

では4とかが返ってきて

$user->getName('user_pref');

では「岩手県」が返ってくる、みたいな感じです。

さらには

$user->getNameObject();

というのもあります。これは、全てのプロパティのgetName()の結果を配列に
して返します。


うわー、なんだかやたら長くなってきたので、まだちょこちょこ機能はありま
すがこの辺で...。お時間あるかたは試してみてください。



users メーリングリストの案内