モノノフ日記

普通の日記です

symfonyのModel

g:catalyst:id:dann:20080305:1204732091g: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

# 一番の問題点はメソッドや変数に付ける自分のネーミングセンスの無さ