リファクタリング:ロジックをまとめる
さて前回も触れましたが、データベース操作関連のロジックは本来MVCのモデルの部分に記述されるべきものでした。これまでの機能実装(返信、ページャー、検索)でアクションクラス(MVCのC)内に溜まっていたロジックを、「BbsdataPeer.php」内(MVCのM)にメソッドとして定義してしまいましょう。
<?php /** * Subclass for performing query and update operations * on the 'bbsdata' table. * * @package lib.model */ class BbsdataPeer extends BaseBbsdataPeer { public static function getMybbsPager($page) { $c = new Criteria(); $c->add(BbsdataPeer::PARENT_ID, 0); $c->addDescendingOrderByColumn(BbsdataPeer::ID); $pager = new sfPropelPager('Bbsdata', 5); $pager->setCriteria($c); $pager->setPage($page); $pager->init(); return $pager; } public static function getMybbsReplies($parent) { $c_reply = new Criteria(); $c_reply->add(BbsdataPeer::PARENT_ID, $parent->getId()); $c_reply->addAscendingOrderByColumn(BbsdataPeer::ID); return BbsdataPeer::doSelect($c_reply); } public static function getSearchResults($word) { $c = new Criteria(); $c1 = $c->getNewCriterion(BbsdataPeer::AUTHOR, '%'.$word.'%', Criteria::LIKE); $c2 = $c->getNewCriterion(BbsdataPeer::TITLE, '%'.$word.'%', Criteria::LIKE); $c3 = $c->getNewCriterion(BbsdataPeer::BODY, '%'.$word.'%', Criteria::LIKE); $c1->addOr($c2); $c1->addOr($c3); $c->add($c1); $c->addDescendingOrderByColumn(BbsdataPeer::ID); return BbsdataPeer::doSelect($c); } }
ページャー機能/返信機能/検索機能の部分をそれぞれメソッドgetMybbsPager($page)
/getMybbsReplies($parent)
/getSearchResults($word)
として定義しました。アクションクラス内に記述していた部分をほぼそのまま持ってきたのが分かると思います。
以上のように定義したメソッドを使う事で、アクションクラス内は次のようになります。
: : public function executeList () { $this->pager = BbsdataPeer::getMybbsPager($this->getRequestParameter('page', 1)); foreach($this->pager->getResults() as $parent) { $no = 'threads'.$parent->getId(); $this->{$no} = BbsdataPeer::getMybbsReplies($parent); } } : : public function executeSearch () { $this->skey = $this->getRequestParameter('kensaku_key'); $this->bbsdatas = BbsdataPeer::getSearchResults($this->skey); }
各機能のために数行をかけて記述していた部分が大分すっきりし、モデルとコントローラーの棲み分けも、よりはっきりしました。