在我的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的通信功能。
但我怎样才能在MySQLDataMapper
和SolarDataMapper
之间切换?
我可以在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 :(得分: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
的文件