2014-10-02 98 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