LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

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やCakePHPFuelPHPなどではライブラリに付随しているORMですが、Zend Framework 2には存在していないのは少し意外でした。

しかし、Zend Framework 2コンポーネントが独立しているという特徴があるため、必要な箇所については他のライブラリを利用する、といったことが柔軟に対応できそうな印象です。

Propel自体もまだ2.0系は開発版ではあるので、もしかすると不具合が生じるかもしれませんが、現時点では良い感じに動いています。コチラについても少しまとめていきたいですね。

参考