2014-10-02 64 views
0

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

我拥有这一切只与MySQL数据库工作。该模型的结构是:

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

现在,我想我需要一个额外的DataMapper,叫SolarDataMapper.php添加到Post目录,并在该文件中添加通信功能的太阳能。

但是我怎么能够在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); 
    } 
} 

这样的事情或者是有另一种方式来完成这件事?任何帮助赞赏。

回答

0

奥克,我解决了我自己的问题!

在文件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; 
    } 

当然我创建了一个名为SolrDataMapper.php的文件,它的solr功能

+0

只是改变你创建服务的逻辑createService(){if($ solr){// solr} else {// mysql}''所以映射器在所有类中都是相同的,不需要用“solrmapper”来修改或扩展 – ins0 2014-10-02 13:31:30

+0

这是真的,但MySQL和Solr必须同时存在。也许这在我的问题中不太清楚。 – Timo002 2014-10-02 13:33:22

+0

确定如此两个更新之间的一个请求lifecircle映射器可以不同?如果是这样,您可以告诉servicemanager每次调用它时都需要一个新实例,每次调用该服务时都会调用createService。我认为这是更清洁,然后编辑所有类和更新的目的 – ins0 2014-10-02 13:35:28