У меня есть контроллер, который собирает данные для передачи в представление. В него вводится (через контейнер прыщиков) сервис, который использует ряд моделей предметной области + бизнес-логику для создания данных.
Сама служба имеет внедренный в нее класс «репозиторий», в котором есть методы для создания сопоставителей данных и возврата экземпляра модели предметной области.
Я понимаю, что, возможно, я не имел представления о концепции репозитория, как указывает Мартин Фаулер он предназначен для «создания еще одного уровня абстракции над уровнем сопоставления» и «Репозиторий является посредником между уровнями сопоставления домена и данных, действуя как коллекция объектов домена в памяти». Так что я могу использовать этот термин ошибочно.
услуга:
class InputService
{
private $repos;
public function __construct($repo) {
$this->repos = $repo;
}
public function getInitialData()
{
$product = $this->repo->getProduct();
$country = $this->repo->getCountry();
$spinalPoint = $this->repo->getPoint();
/*business logic with model instances to produce data array*/
return //array of data
}
}
репозиторий:
class InputRepository
{
private $db;
public function __construct($db) {
$this->db = $db;
}
public function getCountry()
{
$mapper = new CountryMapper($this->db);
$country = $mapper->fetch();
return $country; //returns country object
}
// lots of other methods for returning different model objects
}
картограф:
class CountryMapper
{
private $db;
public function __construct($db) {
$this->db = $db;
}
public function fetch()
{
$data = //code to grab data from db;
$obj = new Country($data);
return $obj;
}
}
Как видите, картографы тесно связаны с классом репозитория, однако я не вижу способа обойти это.
Мне было интересно, есть ли способ реализовать этот репозиторий, который обеспечивает более слабую связь с классами сопоставления данных?
По большому счету, это приложение довольно мало, поэтому необходимость обновления кода для обоих не будет катастрофой, но вы никогда не будете сейчас, когда оно будет расти!