Zend Framework2のモデルにORMのPropelを利用してみる
こんにちは、株式会社ライオンハートの鵜飼です。
今回もZend Framework 2のについてのメモです。
Zend Framework 2にもモデルは存在しているのですが、ORMは存在していないのでORMライブラリのPropelを利用してみました。
その他のPHPのORMライブラリとしては、Doctrineが有名なようです。
Propelをインストール
最近は頼りっぱなしですが、今回もComposerでインストール出来ます。
{ "require": { "propel/propel": "~2.0@dev" } }
composer.json
を上記のように追記して…
composer update
でインストール完了です。
Propelの設定
Propelにはコマンドラインツールが用意されていますので、そちらを利用することで初期設定を簡単に行うことが可能です。
コマンドラインツールは、Composerでインストールするとvendor/bin/propel
にありますので、そのまま利用するかシンボリックリンクを貼るなどして利用する事が可能です。
ln -s vendor/bin/propel propel
次に初期設定を行う際は、propel init
を実行することで簡単に行うことが出来ます。
$ ./propel init Please pick your favorite database management system: > : mysql # mysqlを入力 Please enter your database host [localhost]: # 空を入力 Please enter your database port [3306]: # 空を入力 Please enter your database name: database_name # データベース名を入力 Please enter your database user [root]: user_name # ユーザ名を入力 Please enter your database password: # パスワードを入力(表示されない) Which charset would you like to use? [utf8]: # 空を入力 Do you have an existing database you want to use with propel? [no]: # 空を入力 Where do you want to store your schema.xml? [/vagrant/application]: # 空を入力 Where do you want propel to save the generated php models? [/path/to/application]: /path/to/application/module/Application/src # モジュールのsrcディレクトリを指定 Which namespace should the generated php models use?: Application\Model # namespace名を指定 Please enter the format to use for the generated configuration file (yml, xml, json, ini, php) [yml]: # 空を入力(他の形式でも問題なし) Is everything correct? [yes]: yes + /path/to/application/schema.xml + /path/to/application/propel.yml + /path/to/application/propel.yml.dist Propel 2 is ready to be used!
説明文や確認項目等は省略しましたが、上記のように答えていくことで必要な設定項目を記述したファイルが作成されます。
今回はZend Framework 2に同居させるために、module/Application/src
の中にモデルが作成されるように設定しました。
単体で利用する場合はこの形式にならう必要はありません。
最後にアプリケーション側から読み込む際に必要な設定ファイルを書き出しておきます。
$ ./propel config:convert
generated-conf/config.php
というファイルが生成されますので、コチラをそのまま読み込むか、別の場所に移動させて利用するなどすれば、Propelを扱う事が可能です。
最適かどうかはちょっと不明ですが、自動的に読み込まれるようにconfig/autoload/propel.global.php
に移動させ、返り値が配列じゃないとエラーが出るので、
<?php // ./propel config:convert で生成された内容 return array(); // <-追記
と追記させることで、アプリケーション全体で利用できるようにしてみました。
データベース・モデルを用意する
既にデータベースも構築されているのであれば問題ありませんが、Propelはschema.xml
にデータベース構造の情報を記述することで、Propel側からデータベースの構築と、モデルクラスの生成を行うことが可能です。
モデルクラスも一緒に生成してくれますので、schema.xml
から生成したほうが良いかもしれません。
schema.xml
の記述方法については、リレーション以外は単純ですので、英語ですがドキュメントを読むか、最初から記述されている内容から把握できるのでは無いかと思いますが、また折を見てまとめてみようかと思います。
schema.xml
の記述が完了したら、
$ ./propel diff
を実行すると、マイグレーションファイルが生成されますので、その後マイグレーションを実行することでデータベースが構築されます。
マイグレーションを実行する際は下記のコマンドになります。
$ ./propel migrate
最後に、モデルクラスを生成します。
$ ./propel model:build
今回の設定内容ではmodule/Application/src/Application/Model
配下に生成されているはずです。
内容を見てみると、直下のクラスが利用するクラスで、継承元となるBase
クラスと、データベース内のカラム名やリレーション情報を持つMap
クラスが生成されるようですね。
まだ複雑な処理までは出来ていませんが、直下のクラスに対してZend Framework 2のインタフェース等を適用してしまえば、ある程度親和性の高いモデルクラスを生成することが出来そうです。
雑感
PhalconやCakePHP、FuelPHPなどではライブラリに付随しているORMですが、Zend Framework 2には存在していないのは少し意外でした。
しかし、Zend Framework 2コンポーネントが独立しているという特徴があるため、必要な箇所については他のライブラリを利用する、といったことが柔軟に対応できそうな印象です。
Propel自体もまだ2.0系は開発版ではあるので、もしかすると不具合が生じるかもしれませんが、現時点では良い感じに動いています。コチラについても少しまとめていきたいですね。