DoctrineTweetこんにちは、小川です。本日Doctrine2.0のAlphaバージョンがリリースされました。簡単なチュートリアルも公開されているので、本日は実際に動かしてみたいと思います。今回のリリースについては以下の記事をご覧ください。Release以前僕が書いた、「Doctrine2.0について」という記事をご覧になった方でDoctrine1.xをご存じの方はわかるかと思うのですが、Doctrine2.0は全くの別物です。上記の記事にも書いてあるとおり、実に90%以上ものコードが書き直されています。いえ現在はAlphaバージョン。実装されているのはまだまだ最低限の機能でしかありません。CLIやビヘイビアといった機能が実装されるのはまだ先のことでしょう。本題に入っていきましょう。実際に動かすにあたって、PHP5.3が必要になります。データベースはSQLite3を使用します。チュートリアルはDocument内の以下のページに書いてあります。Quickstartまずはインストールです。Subversionを使います。doctrine2/tools/sandboxdoctrine2という名前でチェックアウトしてきました。このなかのtools/sandboxに設定済みのファイルやディレクトリが配置されています。内部のファイル構成は以下のようになっています。アプリケーションファイルxmlとyamlディレクトリは設定次第で使ったり使わなかったりという感じです。僕はphp5.3をphp-5.3.0という名前の実行ファイルとして作成しているので、doctrineコマンドファイルを以下のように変更しました。php-5.3.0<?phpinclude('doctrine.php');試しにコマンドを実行すると以下のように、利用可能なタスクの一覧が表示されます。[--classdir=<path>]version現在はSQLを実行するrun-sql、データベースの生成などを行うschema-tool、バージョンを確認するversionの3つのタスクが有効になっています。このタスクは後ほど、必要に応じて使用していきます。モデルクラスを作成します。Entitiesディレクトリに以下のクラスファイルを作成して、User.phpという名前で保存します。}}これでモデルクラスの定義完了です。このモデルを元にデータベースを作成します。以下のコマンドを実行しましょう。successfully.これでデータベースを見てみました。SQLiteを使用している場合はdatabase.sqliteというファイルが作成されているでしょう。データベースとかの設定はconfig.phpに記述してあります。データベースを直接みてみます。.quit先ほどクラス定義時に特に指定は行っていないので、クラス名と同じUserという名前のテーブルが作成されています。個人的には小文字の方が好きなので小文字に変えてみます。Entities/User.phpを開き、クラスのアノテーションを少し変更します。...@Tableというアノテーションを追加しました。これでもう一度Schemaの作成を行います。--createこれで先ほどと同じ手順で確認するときちんと小文字になっています。アノテーションの種類はたくさんあり、Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.phpの中にアノテーションが1つひとつクラスとして定義されています。@Columnや@Tableに引数のようなものを渡していますが、これは各アノテーションクラスごとにプロパティとして定義されています。ここらへんがどう展開されているかなどは同じディレクトリ内のAnnotationDriver.phpに記述されています。DoctrineAnnotations.phpをみるとスキーマやリレーションの情報以外に、PreUpdateやPostRemoveなどのフックメソッドや、Doctrineエクステンション用のDoctrineXなどが用意されているようです。Doctrineエクステンションはいわゆるビヘイビアですが、Doctrine2.0でどう扱われるかはまだわかりません。実際に記述してもパースする処理は見当たりませんでした。話がそれましたが、モデルの定義が完了してデータベースも完成したのでいよいよそれを使ってデータベースを操作していきましょう。index.phpを以下のように変更して、User情報を作成してみましょう。Entity;を指定したので名前空間を指定して作成します。オブジェクトを作る流れは特に変わりませんが、保存の流れが変わっています。$emにはDoctrine\ORM\EntityManagerクラスのインスタンスが格納されており、config.phpで作成されています。このEntityManagerクラスはDoctrine2.0において非常に重要な役割をもっているクラスです。他の方法があるかはまだ詳しく調べていないのですが、基本的な保存の方法はこのEntityManagerを経由して行います。EntityManagerに対してpersistメソッドを実行してUserクラスを保存対象にし、flushメソッドを実行することでデータベースへコミットを行っています。EntityManagerの内部で_flushModeというプロパティを持っており、これがFLUSHMODE_IMMIDIATEになっていればpersistした瞬間にflushが行われるようになりますが、デフォルトではFLUSHMODE_COMMITになっているので明示的にflushを行う必要があります。rollbackといったメソッドが用意されています。commitメソッドは内部でflushも呼んでいるので、そこの流れは基本的に変わらないと思います。Saved!」が表示されたら保存完了です。保存されたか見てみましょう。直接データベースをみるのではなく、コマンドラインからSQLを実行することが可能です。}}現在は配列をそのまま出しているだけですが、とりあえず正しくインサートできている(らしい)ことが確認できました。このデータをアプリケーションで取得する方法を書いていきます。index.phpを以下のように上書きします。fivestar!EntityManagerにcreateQueryというメソッドを発行してDQLを渡しています。このcreateQueryはDoctrine\ORM\Queryクラスを作成するメソッドです。プレースホルダが?1というふうになっていますが、この?のあとの数字をキーにパラメータを指定するようになっています。現在の実装ではsetParameterかsetParametersメソッドで値を渡してあげる必要があるようです。getSingleResultメソッドはfetchOneメソッドと同じようにクエリを実行し単一のエンティティを返すメソッドです。getResultやgetArrayResult、getSingleScalarResultなどのメソッドがあり、いくつかの方法でクエリの実行内容を取得することが可能なようです。実装をみていたら今までのDoctrine_QueryのメソッドチェーンでDQLを組み立てる実装はこのQueryクラスには実装されていませんでした。Doctrine_Queryクラスに対応するのはDoctrine\ORM\QueryBuilderクラスになります。先ほどの内容をQueryBuilderを使って行います。fivestar!QueryBuilderは正確にはDQLを作成するためのクラスで、getQueryメソッドを実行して内部でビルドしたDQLを元にQueryクラスを作成する、というところまで行ってくれます。Doctrine_Queryと違いwhereなどの単位でパラメータを設定できなかったり、selectが必須だったりしています。他にもQuery\Exprというクラスがあり、それを用いてクエリの構築を行うような仕組みになっていたりしています。このあたりは今後実装されていくのではと思います。チュートリアルはここまでになります。最近はあまりソースを追っていなかったので深いところまでは書けないのですが、現状ではまだまだ使えるレベルにはなっていないというのが率直な感想です。リリースはまだまだ先の話で、ロードマップでは2010年の3月にリリース予定のようです。半年先のことですのでこれからどんどん機能が実装されていくでしょう。現在DoctrineのブログでもDoctrine2.0の話が増えてきており、今後も様々な情報が配信されると思います。今はまだまだ評価できないですが、リリースが待ち遠しいです。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。