数据映射器依赖关系

时间:2013-03-02 09:19:00

标签: php zend-framework dependencies datamapper

我有一个简单的问题。我正在使用Zend Framework 1,我正在使用Data Mapper。这是我的代码:

<?php

// application/model/Pos.php
class Application_Model_Pos extends Zend_Db_Table_Abstract
{
    protected $_name = 'pos';
}

// application/model/MapperAbstract.php
abstract class Application_Model_MapperAbstract
{
    private $_dbTable;

    public function __construct(Zend_Db_Table_Abstract $dbTable)
    {
        $this->_dbTable = $dbTable;
    }

    public function findById($id)
    {
        $select = $this->_dbTable()->select()->where('id = ?', $id)->limit(1);
        $row = $this->_dbTable()->fetchAll($select)->toArray();

        if(!empty($row))
        {
            $this->_createEntity($row);
        }
    }

    protected function _createEntity(array $row);
}

// application/model/PosMapper.php
class Application_Model_PosMapper extends Application_Model_MapperAbstract
{
    public function __construct()
    {
        parent::__construct(new Application_Model_Pos());
    }

    protected function _createEntity(array $row)
    {
       return new Sb_Pos($row['name']);
    }

// application/library/Sb/Pos.php
class Sb_Pos
{
    public function __construct($name)
    {
        $this->_name = $name;
    }
}


?>

在您的脑海中使用此代码,我应该在哪里处理表依赖项?映射器应该知道另一个映射器吗?我需要服务层吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您好,很有疑问。我最近刚刚在MidwestPHP 2013上做了一个关于这个确切主题的演示 - 幻灯片是here(好的 - 抱歉自我推销!)

基本上,对您的问题的简短回答是我认为需要服务层。处理具有多种方式进行填充和映射的对象时,该服务将所有映射器一起绘制。请记住,映射器可以填充全部或部分数据对象......但它不能“跳转”数据源。因此,如果您的特定对象需要多个数据源来获取其数据,则必须将该对象从mapper传递给mapper。

另一种选择 - 假设您刚刚在ZF中使用数据库 - 将获得基本数据库连接,忽略您的表数据访问对象依赖关系,并构建复杂的连接以检索所有数据。有些人不同意这一点 - 但它是一个非常滑的斜率:在什么时候你开始忽略这些单独的表并开始组合你的sql(为了性能)。希望这有帮助!