スポンサーサイト

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

symfony1.4 jobeet 7日目

今回はカテゴリー周りの実装

まずはルーティングの設定。
その後、カテゴリモデルにデータ取得コード追記していくけど、重複したコード出てくるのでそのリファクタリング方法。
Peerでも似たような事はやってたんだけどDoctrineの方がスマートに実装出来る感じ。

まだモジュールが無いからコマンドからモジュール作成。
今回はgenerate:moduleを使って空のモジュール作成、実案件では doctrine:generate-moduleをそのまま使える案件は少ないだろうからgenerate:moduleで空のモジュール作って実装していった方が逆に早い気がする。実際1.0時はそうしてた。

この後、schema.ymlにSluggableという項目を追加。
これは5日目にJobeetクラスに実装したslugifyの機能を実現してくれるみたい。便利だけどこれって実案件でどれほど要望あるんだろう。
以下、slugifyの内容。
static public function slugify($text){ 
$text = preg_replace('/\W+/','-',$text);

$text = strtolower(trim($text,'-'));

return $text;
}

この後、モデルクラスに重複コードが出てきたようにtemplateにも重複したコードが現れ始めたのでtemplateのリファクタリング。
template のリファクタリングはパーシャルという機能を使用。これは1.0でお世話になったから特に問題無い。

最後にWebシステムではほぼ必須だけど0から作ると結構めんどくさいページングの実装。
propelと同様にdoctrineでもページャー機能を実装してるようなのでその使い方。
ページャーの生成の仕方が多少違うけど使い方はそんなに変わらないから特に問題なく使えそう。
結果数をgetNbResultsじゃなくてcount()で取れるのは地味に便利。
1.0の頃はaddSelectColumn使うとリザルトセットで取らないといけなくなりページャー使えなくなったけどDoctrineではどうなるかは後で調べないと。
後、1.0ではGroupByしてページャー使うと結果数がおかしくなったけどそれは大丈夫なんだろうか?

とりあえず細かいところは別途調べないといけないな。
スポンサーサイト

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多少触ってるので省略。
今後単体テスト勉強する際に詳しく書くかも。

検索フォーム
カレンダー
04 | 2010/04 | 05
- - - - 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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。