少しでもお役に立てるように、
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 か月かかりました)。