symfonyのModel
g:catalyst:id:dann:20080305:1204732091やg:subtech:id:miyagawa:20080306:1204761778を読んでsymfonyで例を考えてみた。
自分がsymfony使ってコード書くときはアプリのコントローラにDBアクセスする処理は直接書いてない。
Model抽象化したクラスにラッパーしたメソッド書いてコントローラから叩いてます(project_dir/lib/model/以下にscaffoldingされるやつ)
lib/model/TablePeer.php
<?php class TablePeer extends BaseTablePeer { public static function getTableFromUserId($userId, $offset = 0, $limit = null) { $c = new Criteria(); $c->add(self::USER_ID, $userId); $c->addDescendingOrderByColumn(self::ID); $c->setOffset($offset); $c->setLimit($limit); $result = self::doSelect($c); return !empty($result) ? $result : null; } }
actions/actions.class.php
<?php class sampleActions extends sfActions { public function executeIndex() { $userId = $this->getRequestParameter('userId'); $this->table = TablePeer::getTableFromUserId($userId); } }
上の処理は、actions.class.php(C)がindexSuccess.php(V)にDBから取得したデータ$tableを渡してます。
こう切り分けてるとDBにアクセスするコードとHTMLに渡すコードが区別されるので後から楽です。
テーブル作成もyamlで出来るから結構便利。
schema.yml
propel: Table: _attributes: { phpName: Table } id: user_id: integer body: varchar(255) created_at: updated_at:
テーブル作成も1コマンドでOK
$ symfony propel-build-all
# 一番の問題点はメソッドや変数に付ける自分のネーミングセンスの無さ