Zend在数据库之间切换

时间:2014-10-02 07:38:29

标签: php zend-framework datamapper

在我的ZEND(2.3)项目中,我有一个数据映射器来连接MySQL数据库。但是这个特定的网站运行在两个数据库上。一个MySQL数据库和一个Solar数据库。基于变量$solarOnline,我需要从MySQL数据库或Solar获取数据。

我只使用MySQL数据库。该模型的结构是:

src\
  Blog\
    Model\
      Post\
        Post.php
        DataMapperInterface.php
        Exception.php
        Factory.php
        IdentityMap.php
        IdentityMapFactory.php
        MySQLDataMapper.php

现在我想我需要在SolarDataMapper.php目录中添加一个名为Post的额外数据映射器,并在此文件中添加Solar的通信功能。

但我怎样才能在MySQLDataMapperSolarDataMapper之间切换?

我可以在DataMapperInterface.php

中执行此类操作
<?php
namespace Blog\Model\Post;

global $solarOnline;

if($solarOnline){
  interface DataMapperInterface{
    public function fetchSolarPostById($id);
  }
}else{
  interface DataMapperInterface{
    public function fetchPostById($id);
  }
}

还是有另一种方法可以完成这项工作吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

Oke,我修复了自己的问题!

在文件IdentityMapFactory.php中,我已经有了一个函数createService()。此函数返回IdentityMap。现在我让它返回2个IdentityMaps。

public function createService(ServiceLocatorInterface $serviceLocator) {
    return new IdentityMap(new MySQLDataMapper(), new SolarDataMapper());
}

IdentityMapAbstract.php

abstract class IdentityMapAbstract {
    protected $_dataMapper;
    protected $_dataMapperSolr;
}

IdentityMap.php

的构造中
public function __construct(DataMapperInterface $dm, DataMapperInterface $dm1){
        $this->_dataMapper = $dm;
        $this->_dataMapperSolr = $dm1;
        return $this;
    }

在现有的函数fetchPostById($id)

private function fetchPostById($id) {
        if($this->solarOnline) {
            $value = $this->_dataMapperSolr->fetchPostById($id);
        }else{
            $value = $this->_dataMapper->fetchPostById($id);
        }
        return $value;
    }

当然我用它的solr函数

创建了一个名为SolrDataMapper.php的文件