2

我有一个快速的问题。我正在使用 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;
    }
}


?>

有了这段代码,我应该在哪里处理表依赖关系?一个映射器应该知道另一个映射器吗?我需要服务层吗?

谢谢你的帮助。

4

1 回答 1

2

你好,很好的问题。我最近在 MidwestPHP 2013 上做了一个关于这个确切主题的演讲 - 幻灯片在这里(好的 - 对自我宣传感到抱歉!)

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

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

于 2013-03-05T15:43:22.973 回答