symfony Modelを調べてみた

muroiです。
今日はsymfonyを学習しながら気づいた点・分からなかった事などを調べながら書いていきたいと思います。
今回はsymfonyにおけるMVCのMの部分、『モデル』がどうなっているのかなと気になったので調べてみました。

モデルの作成。symfonyではschema.ymlを記述してあるコマンドを実行するだけで瞬時に作成する事ができました。

 symfony propel-build-model

これで簡単にクラスができてしまうので驚きでした!

ただ最初のうちはこれで一気にできてしまうのでどうなっているのか全然把握する事ができずにどうしてだろうと悩むばかりでした。(今でもまだまだ理解しきっているわけではないのですが・・・)

基底モデルと現行モデル

上記のコマンドを実行すると、2つのディレクトリ(『model/om』と『model/』)に似た名前のクラスができていたのですがこれがどうしてなのか理解するのにも時間がかかってしまいました。

model/omディレクトリに作成されるのが基底モデルのクラスと呼ばれて、実際に自分達でこのディレクトリに入っているクラス群は修正する事はなく、Propelによって自動生成されるものだそうです。

実際に関数を追加したいとなったらmodel/ディレクトリにある現行モデルと呼ばれるクラス群に追加していけばいいという事で・・・なんでだろう?と思っていましたが、symfonyではモデルを自動生成してくれるので上記のコマンドを実行するたび修正したモデルが消えてしまうのを防ぐためにこうなっているという事が分かりました。

必要な関数があれば現行モデルに追加していき、その現行モデルでは基底モデルにあるクラスを継承しているので基底モデルの関数を利用する事もできるし、DB設計に変更が発生してpropel-build-modelを実行しても変更されるのは基底モデルだけなので今までの修正はちゃんと残っているという・・・修正にも柔軟に対応できるようになっているのですごいなと思いました!

最初これを理解するまではディレクトリやクラスが大量にできて戸惑いましたが、分かってくると便利だなというのを感じます!

PeerとPeerなしのモデルの違い

次に気になったのがこのPeerのつくクラスとそれがつかないクラスがあるという事でした。

例えばschema.ymlで『HogeTable』というテーブルを定義してsymfony propel-build-modelを実行した所以下のようなクラスが出来上がりました。
model/om/BaseHogeTable.php
model/om/BaseHogeTablePeer.php
model/HogeTable.php
model/HogeTablePeer.php
テーブルに対して4つのクラスができてしまったのでどう違うのが把握するのも大変でした。
色々と調べてみた所、Peerのつくクラスは静的にアクセス(オブジェクト化せず)する際呼ばれる関数が集まっていました。
Peerのつかないクラスは、1インスタンスごとに1レコードと対応しており実際にDBにアクセスしてレコードを取り出すのはPeerが行っているようになっていました。

まだまだモデルのあたりは理解しきっていない部分が多いのでこれからどんどん勉強していきたいです。

コメントをどうぞ

名前: (Required)

eMail: (Required)

Website:

Comment:

Spam Protection by WP-SpamFree