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