2009年1月14日水曜日

django2php

PHPの仕事が来てしまったので、
Djangoと似た環境をPHPで探しました。

Djangoの基本要素は以下の4つかな?
・ORM
・Template
・Routing
・Form
DjangoのFormとRoutingは絶品だと思っています。
実際は両方とも書き換えてしまったので、絶品というのは変だけど、
基本設計は秀逸。今も感動しています。

あとの認証、セッション、Middleware(Filter)あたりは、
最初に書けば、あとはあまりいじらないから適当なライブラリから引用すればOK。

あとはディレクトリ構造。
appごとに分けられるDjangoは編集範囲が限定されていて見通しがよい。
rails風はコントローラとモデルが遠くて大変。

ORM


Propel
Doctrine
がいいらしい
Comparing Propel, Doctrine and sfPropelFinder
これはよい比較

YAMLでSchemaを書けて、HQLみたいなのもあるDoctrineがいい感じ。
でもやっぱりDjango-ORMがほしい。

途中、DoctrineでfindOneByTitleという、いかにもmethod_missingを使いました的な、メソッド名を発見。
調べてみたら、__callなんてあるんですね。
面白い。

Propelをメソッドチェーンで動くようにするなど拡張したsfPropelFinderもなかなか努力のあとがにじみ出ていていいですね。

php-django-like-db-abstraction/
「素晴らしい!」と思って、開いたら空っぽでした。
名前だけ取って手をつけない人は、それがどれぐらい迷惑な行為か早く学んでほしい。

template


生PHPが流行らしいです。
レイアウトとかどうするんだろう。
ヘッダとフッタを別々に読み込むの?

form


symfonyのformはDjangoと似ていていいですね。
まだ面倒に感じるのはMetaclassがないからかな?
単体で探したけど、似たものはないので、symfonyを使うか、単体用に取り出すか実装するか。
あるいは別の道を探すか。
inputタグなどを出力するためのHelper関数は多く準備されているようだけど、
ValidationやDBからの出力をこちらで考慮しなければならないのは面倒。
DjangoのFormは優秀。

Routing


Rails-likeが多いですね。
/controller/action/id
というやつね。
正規表現Routing、おまけに間接参照のやつがあれば素敵。
難しいものじゃないし、移植しようかな。

あと、ほしいのがpythonのimport
パスを考慮しながらのrequire_onceは難しい。
あと、まとめて数ファイルimportしたいときもある。

統合するとこんな感じか
urls.php

import('bloggy.views.*');
import('bloggy.form.EntryForm');

add_patterns(array(
'' => 'index',
));
add_patterns(array(
'new' => 'EntryForm.create',
'entry/(?P[0-9]+)' => 'EntryForm.edit',
), 'admin_required');

forms.php

class EntryForm extends Form {
var $conf = array(
'name' => Form::TextField(),
);
}

PHPの構文が分からない、これでコンパイルとおるかな。
EntryFormをimportしたときに継承して拡張したEntryFormを渡すことってできるのかな。
同名だから無理かな。
じゃあ、定義は_EntryFormか。

やだねー、ほかの言語仕様に縛られて無理やり持ち込む人。
もっと柔軟になったほうがいいと思います。
symfonyおぼえよっと。

あと、Kohanaも結構優秀でした。
程よいimport(loading)、routing

0 件のコメント: