PHP DataMapper具有多个持久层

前端之家收集整理的这篇文章主要介绍了PHP DataMapper具有多个持久层前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在用 PHP编写一个系统,它必须写入三个持久层:

>一个Web服务
>两个数据库(一个MysqL一个mssql)

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

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

<?PHP
    $service = $factory->getService()->create($entity);
?>

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

<?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);
    }   
}
?>

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

我认为它有三个选择:

>将三个映射器注入服务并在每个映射上调用create
> $_mapper是一个数组/集合,它遍历它们,在每个上调用create
> $_mapper实际上是一个充当a的容器对象
进一步代理和调用创建每个

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

我不得不解决类似的问题,但很多年前在PEAR DB时代.在该特定情况下,需要跨多个数据库复制数据.

我们没有不同数据库具有不同映射的问题,所以它更简单一些.

我们所做的是对DB类进行外观并覆盖getResult函数(或者它所调用的任何函数).然后,这个函数分析了sql,如果它是一个读取 – 它会将它发送给一个支持的,如果它是一个写,它会将它发送给所有人.

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

从这个背景来看,我建议完全介绍所有持久性操作.完成后,实现细节不太相关,可以随时更改.

从这个角度来看,您的任何实现想法似乎都是一种合理的方法.不过,你会想到各种各样的事情.

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

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

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

希望这可以帮助.

猜你在找的PHP相关文章