PHP DataMapper具有多个持久层

Joh*_*yal 8 php architecture oop datamapper

我正在用PHP编写一个系统,它必须写入三个持久层:

  • 一个Web服务
  • 两个数据库(一个mysql一个mssql)

原因是遗留系统无法更改.

我想使用DataMapper模式,我正在尝试建立实现我想要的最佳方式.我有一个如下界面:

<?php
    $service = $factory->getService()->create($entity);
?>
Run Code Online (Sandbox Code Playgroud)

为简洁起见,下面是一些人为的和减少的代码:

<?php
class Post extends AbstractService
{
    protected $_mapper;

    public function create(Entity $post)
    {
        return $this->_mapper->create($post);
    }
}

class AbstractMapper
{
    protected $_persistence;

    public function create(Entity $entity)
    {
        $data = $this->_prepareForPersistence($entity);
        return $this->_persistence->create($data);
    }   
}
?>
Run Code Online (Sandbox Code Playgroud)

我的问题是因为有三个持久层,因此每个都可能需要三个映射器.我想要一个干净的设计模式灵感的界面,使这项工作.

我认为它有三个选项:

  1. 将三个映射器注入服务并在每个上调用create
  2. $ _mapper是一个数组/集合,它遍历它们,在每个上调用create
  3. $ _mapper实际上是一个容器对象,它充当另一个代理并在每个上调用create

这些解决方案中的每个解决方案都让我觉得错误,并且会感谢任何可能适合这种情况的反馈/认可的设计模式.

dro*_*.ah 2

我必须解决类似的问题,但很多年前,在 PEAR DB 时代。在这种特殊情况下,需要跨多个数据库复制数据。

不过,我们没有遇到不同数据库具有不同映射的问题,因此它要简单一些。

我们所做的是外观 DB 类并重写 getResult 函数(或任何名称的函数)。然后,该函数分析 SQL,如果是读取,则将其发送给仅一个备份,如果是写入,则将其发送给所有备份。

对于使用率很高的网站来说,这实际上非常有效。

从这个背景来看,我建议完全放弃所有持久性操作。完成此操作后,实施细节的相关性就会降低,并且可以随时更改。

从这个角度来看,您的任何实现想法似乎都是合理的方法。不过,您需要考虑很多事情。

  • 如果其中一个后端抛出错误怎么办?
  • 写入三个数据库服务器对性能有何影响?
  • 写入是否可以异步完成(如果是,请再次询问第一个问题)

也可能有另一种方法可以解决这个问题。那就是使用存储过程。如果您有一个主数据库服务器,您可以编写一个触发器,该触发器在提交(或大约)时连接到另一个数据库并同步数据。

如果不需要立即更新数据,您可以让主数据库记录更改,并使用另一个脚本定期将此数据“馈送到”另一个系统中。同样,需要考虑错误问题。

希望这可以帮助。