-1

I'm used to create my business logic inside my dbtable classes, but from what I read, it's a bad design.

I've been reading a lot of articles about Model Architecture for zend framework but I'm still confused of what approach I should use.

Based from your experience, what approach do you use? (Datamappers or by using ORM) (also taking into consideration Rapid Application Development)

4

1 に答える 1

2

少しでもお役に立てるように、

ZF DbTable クラスを使用してビジネス ロジックを保持する理由は、そのようにすることが「関心の分離」に違反するためです。

次のようなことを行うことによって:

class Application_Model_DbTable_Genre extends Zend_Db_Table_Abstract
{
    protected $_name = 'genre';
    protected $_primary = 'id';

    public function fetchAllGenre()
    {
        $select = $this->select();
        $select->order('name ASC');

        $result = $this->fetchAll($select);

        return $result;
    }
}

モデルがデータベースに結合されます。したがって、データ ソースを変更する必要がある場合は、このテーブルに関係するすべてのコードをリファクタリングする必要があります。

現在、ZF が提供する DbTable モデルを使用できますし、使用する必要がありますが、データ マッパーおよびドメイン モデルと合わせて使用​​してください。

//Domain Model
class Video_Model_Genre extends Jgs_Model_Entity_Abstract
{
    protected $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }
}

//The mapper
class Video_Model_Mapper_Genre extends Jgs_Model_Mapper_Abstract
{
    protected $_tableName = 'genre';

    function __construct(Zend_Db_Table_Abstract $tableGateway = null)
    {
        //Pass in the DbTable Model, This is the database adapter for this mapper.
        $tableGateway = new Application_Model_DbTable_Genre();
        parent::__construct($tableGateway);
    }

   //create the domain object 
    protected function createEntity($row)
    {
        $data = array(
            'id'   => $row->id,
            'name' => $row->name
        );

        return new Video_Model_Genre($data);
    }

    public function saveGenre(Video_Model_Genre $genre)
    {

        if (!is_null($genre->id)) {
            $select = $this->getGateway()->select();
            $select->where('id = ?', $genre->id);
            $row = $this->getGateway()->fetchRow($select);
        } else {
            $row = $this->getGateway()->createRow();
        }
        $row->name = $genre->name;

        $row->save();
        return $row;
    }
}

[注:] これらのクラスを構築するために使用される基本/抽象クラスを見たい場合は、Github、ライブラリ

マッパーとドメイン モデルを使用する上で非常に重要なことは、ドメイン モデルはデータの取得元を気にしないということです。複数のデータ ソースがある場合、同じドメイン モデルを構築する各データ ソースへのマッパーを構築できます。

たとえば、「ジャンル」オブジェクトの作成に必要なすべての情報を含む XML ファイルがある場合、その XML ファイルをデータ ソースとして使用するマッパーを作成できますが、同じドメイン モデルを使用して、 「ジャンル」オブジェクト。

ORMを使用する限り。ORM は、使い方を理解すれば、すばらしいものになる可能性があります。ほとんどの ORM の学習曲線はかなり急勾配です。データマッパーパターンを実装する方法をまだ知らず、理解していない場合は、ORM の準備ができていない可能性があります。私はそうではないことを知っています (マッパーでここまで到達するのに 3 か月かかりました)。

于 2012-09-10T07:37:25.527 に答える