В моем проекте ZEND (2.3) у меня есть datamapper для подключения к базе данных 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
Теперь я думаю, что мне нужно добавить дополнительный datamapper, называемый 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);
}
}
Или есть другой способ сделать это? Любая помощь приветствуется.
Ок, я исправил свою проблему!
В файле 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
Других решений пока нет …