Как мне правильно построить архитектуру куска приложения? В данных есть кабинеты и соотнесенные к ним запись по часам.
Cabinets:
|id|
|1|
|2|
Zapis:
| cabinet_id | date | time | value |
Хочу попробовать создать архитектуру основанную на хранении данных в репозиториях.
Есть экшен контроллера котрый рендерит запись на день.
В моем понимании есть интерфейс репозитория кабинетов, внутри имплементированного репозитория (реализации интерфейса, ссори за французский ), есть фабрика которая создает этот кабинет, есть класс кабинета, где я в конструкторе получаю записи по кабинету из бд.
Я не пойму как мне, на каком этапе связать фабрику и репозиторий. Или мне нужно внутри экшена лепить два репозитория, один SQL, второй мемори, и делать так SQLRepo-> Factory -> MemoryRepo, чтобы все соответствовало стандартам.
И в догон, правильно ли я поступаю получая запись в конструкторе кабинета?

21 Авг 2019 в 07:02
234 +1
0
Ответы
1

Давайте разберемся по порядку. Правильный подход к построению архитектуры приложения с использованием репозиториев предполагает разделение отвественностей и обеспечение независимости компонентов приложения.

Интерфейс репозитория кабинетов (CabinetsRepository):

interface CabinetsRepository {
public function getById(int $id): Cabinet;
}

Реализация репозитория кабинетов (CabinetsRepositoryImpl), где присутствует внедрение зависимости от фабрики (CabinetFactory) и возможно от репозитория записей (ZapisRepository):

class CabinetsRepositoryImpl implements CabinetsRepository {
private $cabinetFactory;
private $zapisRepository;
public function __construct(CabinetFactory $cabinetFactory, ZapisRepository $zapisRepository) {
$this->cabinetFactory = $cabinetFactory;
$this->zapisRepository = $zapisRepository;
}
public function getById(int $id): Cabinet {
// Логика получения кабинета из БД
$cabinet = new Cabinet($id, $this->zapisRepository->getZapisByCabinetId($id));
return $cabinet;
}
}

Фабрика кабинетов (CabinetFactory):

class CabinetFactory {
public function createCabinetFromArray(array $data): Cabinet {
// Логика создания кабинета из массива данных
return new Cabinet($data['id'], $data['zapis']);
}
}

Класс кабинета (Cabinet):

class Cabinet {
private $id;
private $zapis;
public function __construct(int $id, array $zapis) {
$this->id = $id;
$this->zapis = $zapis;
}
}

Экшен контроллера, который рендерит запись на день (например, RenderDayAction):

class RenderDayAction {
private $cabinetsRepository;
public function __construct(CabinetsRepository $cabinetsRepository) {
$this->cabinetsRepository = $cabinetsRepository;
}
public function execute(int $cabinetId) {
$cabinet = $this->cabinetsRepository->getById($cabinetId);
// Логика рендеринга записи на день
}
}

Таким образом, вам не нужно связывать фабрику и репозиторий напрямую. Вы можете инъектить фабрику в репозиторий и использовать ее внутри для создания кабинетов. Что касается получения записи в конструкторе кабинета, это допустимая практика, но не забывайте о возможности ленивой загрузки при необходимости.

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир