designall.dll

順調に進化を続けるLithiumから例外的に0.9.5がリリースされました。今回も多くの新機能がアナウンスされています。

原文

http://rad-dev.org/lithium/wiki/blog/Lithium-0-9-5-Dont-Stop-Till-You-Get-Enough

Lithium0.9.5:止まるにはまだ早い

0.9から1週間半が経ち、Lithiumチームはバージョン0.9.5をアナウンスします。本来のリリーススケジュールに予定されていませんが、今週非常に多くの事を達成したので中間のリリースを行うことにしました。これによりコミュニティの開発者は以下の優れた機能を試す事ができます。

HTTP Auth Adapter:HTTP認証を検証できるようにする`Auth`アダプタが追加されました。`Form`アダプタと同時に利用する事もできます。標準的なログインによる同一の資格情報を持ったWEBサービスへのリクエストを認証できます。(Twitterのクライアントのような例を想定してください)

再設計されたロガーAPI:我々の最初の(そしておそらく最後の)メジャーな後方互換性の無い変更です。より直感的なインターフェースを提供する為にロガーAPIを再設計しました。設定名の代わりに優先度を指定し、それぞれの優先度に対して一つのアダプタを指定します。それぞれの設定は任意の名前を付ける事ができ、priorityキーでどの優先度にアダプタが応答するかを指定します。この柔軟性により重要度の高いメッセージを複数のログに残せます。[Logger APIドキュメント]をご覧ください。

Growlロガーアダプタ:再設計されたロガーAPIともにMax OSXでポピュラーな通知システム、Growlへのアダプタもリリースされました。(オリジナルの実装者はSean Coates)。リリースされたバージョンは、最初から外部に依存関係が無いように書き直され、高速開発に大きな助けになります。

モデル初期化処理のリファクタリング:モデルクラスの初期化処理がリファクタリングされ、大幅に合理化されました。これによりモデルクラスは`lithium\data\Model`を継承したいくつかの基底クラスを継承できます。またクラスは任意のプロパティを継承します。

リードスルーキャッシュ:通常のキャッシュ処理は2つのステップで行われます。指定されたキーを元にキャッシュが存在するかを確認し、存在しない場合はキャッシュする為の処理を行い結果をキャッシュに書き込みます。リードスルーキャッシュはこのプロセスをより直感的にします。次のコードを例を考えます:

$id = $this->request->id;
$user = Cache::read("storage", "user.{$id}", array('write' => function() use ($id) {
    return array('+2 days' => serialize(User::find($id)->data()));
}));

キャッシュキーが存在しない場合は、渡された関数が呼び出され返されたデータは、キーに保存され、返す値のarrayのキーキャッシュの有効期限として使用します。このインターフェイスを使用して、キャッシュのチェックとセットを1度の処理で行えます。

ベンダライブラリのための新しいソース管理:我々は、デフォルト配布用に2つのディレクトリを追加しました:`libraries/ _source`と`app/libraries/_source`です。これらのディレクトリはあなたが外部のライブラリをコピーするかチェックアウトし、より簡単にアプリケーションと同期させる為に作られました。外部ライブラリを`_source`ディレクトリに配置した後、実際にソースコードを含むディレクトリを`libraries`ディレクトリとしてsymlinkできます。
たとえば、私はアプリケーション内でいくつかのPEARクラスを利用しています。私の現在の設定は次のようになります:

Libraries::add("PEAR", array(
    "prefix" => false,
    "includePath" => true,
    'path' => LITHIUM_LIBRARY_PATH . "/PEAR/pear/php",
    "transform" => function($class) { return str_replace("_", "/", $class) . ".php"; }
));

実際のPEARのソースコードは`PEAR/pear/php`内にネストされています。これは醜いです。その代わりに、`PEAR`ディレクトリを`app/libraries/_source`の中に移動し、`app/libraries/_source/PEAR/pear/php`から`app/libraries/PEAR`へのsymlinkを追加しました。これで設定を下記のようにシンプルに変更できます:

Libraries::add("PEAR", array(
    "prefix" => false,
    "includePath" => true,
    "transform" => function($class) { return str_replace("_", "/", $class) . ".php"; }
));

PHP 5.3の標準的なネーミングに従っているライブラリの場合は、その差はさらに歴然です。例えば、PEAR2の場合はシンプルに

Libraries::add('PEAR2');

とするだけでインポートできます。
この規約によって複数のバージョンのライブラリをsymlinkの切り替えだけで透過的に変更できるというメリットもあります。この規約は、Paul M. JonesSolarPHPプロジェクトに触発されました。

MongoDB条件演算子:我々はMongoDBのネイティブなクエリ演算子を常にサポートしてきました。さらにSQLスタイルのクエリ演算子のサポートを追加しました。標準クエリの構文を使用する例:

Article::find('all', array('conditions' => array(
    'expires' => array('>' => time())
)));

これは自動的にネイティブなMongoDBのクエリ演算子に変換されます。これはMongoの(素晴らしい)構文を単に置き換えるものではなく、プラグインの開発者に対して様々なデータソースで動く抽象的なクエリを書く手段を提供する事と新たに非リレーショナルデータベースに興味を持つ開発者や既存のアプリケーションの移植へのバリアフリーも目的にしています。
最後に全てのチームメンバーに感謝しています。特にジョンアンダーソンに、我々のドキュメントリードは、我々は、新しいAPIドキュメントを大量に追加してAPIを100%カバーするという目標の目前にまで来ています。変更履歴、または新しいAPIドキュメントを閲覧するか、新しいリリースをダウンロードしてお楽しみください!
~Nate~

--翻訳ここまで

1週間半で大きな進展が会ったことが伺えます。特にNoSQLなデータベースを透過的に扱う技術は多くの人にとって有益ですし、キャッシュの実装をクロージャを使って簡単にする例などは示唆に富んでいますね。ログをGrowlにながすというアイデアも秀逸です!