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

21 Авг 2019 в 07:02
216 +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 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир