【问题标题】:Data Mapper Dependencies数据映射器依赖项
【发布时间】:2013-02-16 20:15:13
【问题描述】:

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


?>

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

感谢您的帮助。

【问题讨论】:

  • 我想向您指出survivethedeepend.com,第 9 章关于使用映射器进行延迟加载。但是在这个特殊的地方,网站似乎已经关闭了。

标签: php zend-framework dependencies datamapper


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多