加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP DataMapper具有多个持久层

发布时间:2020-12-13 13:18:36 所属栏目:PHP教程 来源:网络整理
导读:我正在用 PHP编写一个系统,它必须写入三个持久层: 一个Web服务 两个数据库(一个mysql一个mssql) 原因是遗留系统无法更改. 我想使用DataMapper模式,我正在尝试建立实现我想要的最佳方式.我有一个如下界面: ?php $service = $factory-getService()-create($e
我正在用 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,如果它是一个读取 – 它会将它发送给一个支持的,如果它是一个写,它会将它发送给所有人.

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

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

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

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

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

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

希望这可以帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读