こんばんは。そろそろ健康診断なのでダイエットしようかと思ってる@madapajaです。
特にSymfony界隈などで話題になっている、PHP5.4+向けに開発が行われているリソース指向フレームワークBEAR.Sundayは皆さんチェックされてますか?
このフレームワークはPHP5.2+向けのリソース指向フレームワークBEAR.Saturdayの新バージョンにあたるもので、設計の全てを見直して@koriym氏によって開発が進められています。
リソース指向や、開発思想などについてはとってもここでは書き切れないので BEAR Blogなどをチェックしていただければと。
さて、そんなBEAR.Sundayですが、まだ開発中のフレームワークですので実際に使う上で足りない機能もたくさんありますし、アプリケーションコントローラなども機能追加や仕様変更がこれからたくさん行われることになるようです。
だけど、Bear.Sunday Meetup #0 が開催されるようだという情報も出回ってるいるので、さわりだけでも触ってみたい!
ということで、今後も仕様の変更はほとんど考えられない Ray.Di と Ray.Aopを使ってみよう、という企画です。
Rayって何?
Rayは、Google GuiceというJavaフレームワークのPHP版で、BEAR.Sundayと同じく@koriym氏によって開発されています。
Rayは2つのパッケージ、一つはDI(Dependency Injection)を行うためのRay.Di、もう一つはアスペクトを構成するためのフレームワークRay.Aopから構成されています。
今回はRay.Aopにあるサンプルを元にRayでどのようにアプリケーションを構成できるのかを見ていきたいと思います。
なお、今回のサンプルの完成版は下記においてありますので参考にどうぞ。
なお、このチュートリアル(?)ではGit、PHP5.4、PDO SQLite拡張が必要です。
RayをComposerでインストール
Ray/DiとRay/Aopをrequireに指定してcomposer install すればOK?と思ったのですが、そうは問屋が卸してくれませんでした。
試行錯誤の結果、下記の内容でインストールできたので実際にやってみる方はコピペするのが吉かと。
ついでに、自分の書くソースのautoload設定も追加しておきます。
私は名前空間は"Madapaja\Ray\Di\Sample01"としてsrcディレクトリ配下に置くことにしました。
composer.json
{
"require": {
"php": ">=5.4.0",
"ext-pdo": "*",
"ext-pdo_sqlite": "*",
"Ray/Di": ">=1.0.x-dev",
"doctrine/common": "2.3.x-dev",
"Ray/Aop": ">=1.0.x-dev",
"Aura/Di": ">=1.0.x-dev"
},
"autoload": {
"psr-0": {
"Aura\\Di": "vendor/Aura/Di/src/",
"Madapaja\\Ray\\Di\\Sample01": "src"
}
}
}
上記ファイルが出来たら
curl -s http://getcomposer.org/installer | php
php composer.phar install
として、ライブラリをインストールしましょう。
実行して、ずらずらーっと文字が出てきて最後に「Generating autoload files」と表示されればOK。
では、実際にソースを書き始めます。
書き始める
さっそく、Rayを使いたいところですが、ぐっと我慢して普通のアプリケーションの開発と同じくモデルを書くところから始めます。
Userクラスを下記のように作りました。
src/Madapaja/Ray/Di/Sample01/Model/User.php
namespace Madapaja\Ray\Di\Sample01\Model;
class User
{
private $db;
public function __construct(\PDO $pdo)
{
$this->db = $pdo;
}
public function init()
{
return $this->db->query('CREATE TABLE User (Id INTEGER PRIMARY KEY, Name TEXT, Age INTEGER)');
}
public function createUser($name, $age)
{
$sth = $this->db->prepare('INSERT INTO User (Name, Age) VALUES (:name, :age)');
return $sth->execute(array(':name' => $name, ':age' => $age));
}
public function readUsers()
{
$sth = $this->db->query('SELECT Name, Age FROM User');
$result = $sth->fetchAll(\PDO::FETCH_ASSOC);
return $result;
}
}
なんてことはないDBのUserテーブルを操作する普通のクラス(Model)です。強いて言えば、依存関係は自分で解決せずに、DIによって後で良きに計らってもらえるように、コンストラクタでPDOインスタンスを受け取る形にしたくらいです。
もちろんこの段階でこのクラスに対してテストを書くのも簡単ですね。今回はこんな感じで書いてみました。
ここからRayの出番です
という所なのですが、予想以上に長くなってきた(というか疲れた)ので、其の弐に続きます!
実際のRayを触るのは次回になってしまいましたが、待ちきれないぜ、俺は今やりたいんだよ、という方はmadapaja/ray-di-sample のコミット履歴なんかが参考になるかもしれません。
(7/11追記)其の弐書きました!
参考リンク
PHP5.4+フレームワーク BEAR.Sundayを理解するためにRay.Diを触ってみるの巻シリーズ