AIR:AIR1.0リリース
2008/02/26 火曜日 - 13:57:03 by decamaAIR1.0リリース。
でも、今はまだ触れないのがもどかしい。
早く今のサイト形にしないと。
出来たかなぁ、と思ったらうまくいってない。
sshからシェルスクリプトを直接走らせるとちゃんと動くのに、PHPのsystemで呼んであげるとうまくいかない。
ハマリまくりだ。
どっちにしろ、ページのロード完了待ちでリアルタイム生成は無理っぽそうだから、処理待ちをキューで処理するしかなさそう。全部シェルに持ってく方がいいかも。
ちょっとハマりかけたのでメモ。
__CLASS__は宣言時のクラス名を返す。
あるクラスのメソッドで__CLASS__を参照した場合、それを継承したクラスでそのメソッドをコールすると、親クラスのクラス名が参照される。なので、継承したクラス側でも自分自身のクラス名を参照させる場合は、get_class($this)を使う。
どうせならホントはpear/Authじゃなくて独自の認証を実装すべきなんだけど、とりあえず一つテストを兼ねて社内用アプリを作る必要があったので、ORMもどきのModelコントローラ(PDOで構築)をコンテナにしてAuthを組み込んだ。
バリデータ/フィルタ、なんちゃってORM、認証系の実装が終わったので、システムを構築してみよう。
足りないものやら問題点やらがハッキリ見えてくるでしょ。
php5に限定したvalidator/filterクラスの実装が終わったので、Modelコントローラを書く。
同じくphp5に限定して、ORMっぽい動きをさせてみる。とりあえず1レコードのCRUDを簡単に出来るようにしてみよう。
これまで使ってた汎用validate/filterクラスを配列対応に刷新しようと書きながら、複数ファイルのアップロードを調べてたら新しいエラーコードが追加されてた。
UPLOAD_ERR_EXTENSION
値: 8; ファイルのアップロードが拡張モジュールによって停止されました。 PHP 5.2.0 で導入されました。
ってあったので、マニュアルサイトのアップデート情報を探してたら、なんと
新しい拡張モジュール
これらの拡張モジュールは、PHP 5.2.0 以降で (デフォルトで)新しく追加されました。
Filter - データの検証とフィルタリングを行います。ユーザの入力のように、安全でないデータを扱うときに使用することを考慮した設計になっています。この拡張モジュールはデフォルトで有効になります。デフォルトのモードである RAW は、入力データに一切手を加えません。
JSON - JavaScript Object Notation (JSON) データ交換フォーマットを実装します。この拡張モジュールはデフォルトで有効になります。
Zip - ZIP 圧縮されたアーカイブおよびその中のファイルを透過的に読み書きすることができます。
『やっとJSONを組み込むんだ・・・Filter?』
テストしながら「これでやっと先に進める?」とか思いながら、ここ数日やってたのに、こんなところにこんなモノがあるなんて・・・
ファイルアップロードには対応してないし、どうやらまだきちんと動かないみたいだから、とりあえず構築は最後まで終わらせよう。
自分の実装とこれ(Filter)が近かったので、とりあえず良しとしようかな・・・
いろんなフレームワークを触ってみてるけど、配列で送られて来たフォームをきちんとバリデートしてくれるフレームワークがあんまり無いことに驚かされてしまう。
配列で送られてくるようなフォームを書くからいけないのかな?
配列で送らないようにすると、フォームを作るときの手間がとんでもないことになるよなぁ。
他の人たちはどうやってこの問題を解決してるんだろう?
とりあえず自分は、自分なりのValidateクラスを書いてみよう。
(これを誰かがやってると思ってフレームワークに走ったのになぁ。)
サーバーサイドでValidateするか、クライアントサイドでValidateするか、そこの問題もあるよなぁ。
prototype.jsを使うようになって、bindがとても便利なことに気づかされたんだけれども、これと同様のことをphpでやろうと思った時に、どうすればいいのか考えなきゃならなくなった。
Smartyが使えるかどうかわからないサーバに、テンプレートを使わなきゃいけないような実装をしなければならなかったので、
preg_replace_callbackを使って変数をパースさせようとしてみた。コールバック関数側でアサイン用の配列を参照してパースすればいいじゃん、と思って組んでみた。
ところが、コールバック関数には、正規表現にマッチした文字列が配列で投げられるだけで、他に参照用の配列を渡せない。
コールバック関数側で、参照用配列をglobalでアクセスすればいいんだけど、これだと美しくない。
で、こうしてみた。
class Binder
{
var $bind;
function __construct($arg = NULL)
{
if (!is_null($arg)) $this->bind = $arg;
}
function __call($foo, $args)
{
array_unshift($args, $this->bind);
return call_user_func_array($foo, $args);
}
}
コールバック関数が呼ばれる前に、
$bind = new Binder($assigned);
みたいにバインドさせる変数を事前に渡しておいてから、コールバック関数を
array($bind, "myfunc")
で呼び出せば、バインド用に渡しておいた変数を一緒に投げてくれる。
無理やりな解決策だったけど、これはもうちょっと考えてあげれば面白いかもしれないのでとりあえずのメモ。