-1

我习惯于在我的 dbtable 类中创建我的业务逻辑,但从我读到的内容来看,这是一个糟糕的设计。

我一直在阅读很多关于 zend 框架的模型架构的文章,但我仍然对应该使用哪种方法感到困惑。

根据您的经验,您使用什么方法?(Datamappers 或使用 ORM)(同时考虑快速应用程序开发)

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、Library

使用映射器和域模型真正重要的是域模型不关心数据来自哪里。如果您有多个数据源,您可以为构建相同域模型的每个数据源构建一个映射器。

例如,如果我有一个 XML 文件,其中包含构建“流派”对象所需的所有信息,我可以构建一个使用该 XML 文件作为数据源的映射器,但我仍将使用相同的域模型来构建“流派”对象。

至于使用 ORM。在你知道如何使用它之后,ORM 会很棒。大多数 ORM 的学习曲线非常陡峭。面对现实吧,如果您还不知道和理解如何实现数据映射器模式,那么您可能还没有准备好使用 ORM。我知道我不是(我花了 3 个月的时间才用映射器走到这一步)。

于 2012-09-10T07:37:25.527 回答