スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

symfony1.4 jobeet 6日目

今回はモデルの詳細

symfony1.0からsymfony1.4に移る際に大きく変更になった部分の一つがデフォルトのORマッパーがPropelからDoctrineに変わった事。

個人的なイメージとしてPropelはSQLよく分からない人向け、DoctrineはSQL詳しい人向けのモデルだと思う。
PropelはSQLよく分からなくても必要な情報セットすれば使える、Doctrineはオブジェクト生成時に発行しようとしてるSQLがイメージしやすい。ただ、Doctrineはある程度オブジェクト指向を理解出来ないと使うの難しいそう。

6日目はまず一覧を取得してたコードをDoctrine_Queryへの変更の仕方の説明。
Doctrine_Queryについては後でAPIなど見て何が出来るのは調べる。
で、SQLのログに関しての説明もあったけど出力される内容がプリペアドステートメントの?のままの内容が出力されるのでWhere条件が多いSQLを実際データベースに流しこんで確認する時はそのまま流せないのがめんどくさそう。

saveメソッドの上書きは1.0でもよくやってた内容なので特に問題ない。

その後にカスタムコンフィギューレーションの説明があったけどこれも1.0でやってたから大丈夫。
1.0使い始めたばかりの時は"app_"を付け忘れて結構悩んでたけど今はもう付け忘れることも殆どない。

その後にリファクタリングの説明。Actionの中で記述しているSQL発行のコードをTableクラスに移動。
1.0だとPeerクラスに書いていた内容。
ここで一つ困ったことが。。。
Peerの時はSQL発行のメソッドはPeerクラス内にstaticメソッドとして定義してActionから呼び出してたのにDoctrineだとstaticが付かずTableクラスをインスタンス化してから呼び出すようになる。
で、どこでインスタンス作るんだろうと思った。ActionからはDoctrine_Coreを経由して呼び出すことになるらしい。
$this->categories = Doctrine_Core::getTable('JobeetCategory')->getWithJobs();
これだとeclipceの補完機能やメソッドへのジャンプが出来ないからメンドクサイんだけどなぁ。
上記に書いたように1.0の時はActionからstaticなメソッド呼んでたからeclipceでコード補完出来るという理由で長くても処理の内容が分かるメソッド名にしてたけどこれだとあんまり長いメソッド名にしたくないなぁ。
あえて言うけどこの作りは使いにくい。もうちょっと改善して欲しいなぁ

この後、クエリーのマージの説明。
// lib/model/doctrine/JobeetCategory.class.php
public function getActiveJobs() {
$q = Doctrine_Query::create()
  ->from('JobeetJob j')
  ->where('j.category_id = ?', $this->getId());
  return Doctrine_Core::getTable('JobeetJob')->getActiveJobs($q);
}

// lib/model/doctrine/JobeetJobTable.class.php
public function getActiveJobs(Doctrine_Query $q = null) {
if (is_null($q)) {
$q = Doctrine_Query::create()
->from('JobeetJob j');
}

$q->andWhere('j.expires_at > ?', date('Y-m-d H:i:s', time()))
->addOrderBy('j.expires_at DESC'); return $q->execute();
}
この使い方はかなり便利。1.0で似たような事やってた時はかなり冗長的なコードになってた(俺の書き方が悪かっただけ。。)

この後に有効期限が切れた情報をルーティングで404にハンドリングする方法の説明があった。
# apps/frontend/config/routing.yml 
job_show_user:
url: /job/:company_slug/:location_slug/:id/:position_slug
class: sfDoctrineRoute
options:
model: JobeetJob
type: object
method_for_query: retrieveActiveJob
param: { module: job, action: show }
requirements:
id: \d+
sf_method: [GET]
昨日作成したrouting.ymlにmethod_for_queryを追加して呼び出したいメソッドを指定。
retrieveActiveJobは省略します。

この他に6日目の内容としては動的なフィクスチャ(テストデータ)の説明もあったけどこれも1.0多少触ってるので省略。
今後単体テスト勉強する際に詳しく書くかも。

スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
RSSリンクの表示
last.fm
twitter
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。