Правильные слои приложения
Я не понимаю, на какие слои правильно делить приложение, чтобы не нарушать базовые принципы ООП и SOLID.
Например, я работаю в определенной CMS, где уже реализовано какое-то API. Мне нужно развитьOrder
класс, который будет иметь такие методы:,
interface OrderInterface {
public function getOrderDate(): \DateTime;
public function getAmount(): float;
public function getBuyer(): \OrderBuyerInterface;
public function getProducts(): \ProductCollection;
}
class Order implements OrderInterface {
}
, Как я уже писал, в нашей CMS уже есть функционал по работе с заказами, но этот функционал достаточно низкоуровневый, поэтому мы пишем свою оболочку.
У меня есть следующие вопросы:
Один. Правильно ли я понимаю, что мне не следует делать запросы вOrder
через стандартный API и получить зависимости порядка ( OrderBuyer
или ProductCollection
)? Те. мне нужно внедрить эти зависимости? Если да, то какой уровень приложения должен заниматься извлечением данных из базы данных через стандартный API, создавая объекты сущностей (OrderBuyer
или Product
-коллекция) и впрыскивая их в Order
?
Два. Что делать, если в классе Order хранится дополнительный идентификатор менеджера, аgetManager
вызывается метод, только тогда произойдет дополнительный запрос к базе данных и произойдет выборка? Те. вам нужна ленивая загрузка, чтобы не выполнять предварительную выборку и не вставлять ее вOrder
?
Как решаются такие проблемы? Ведь оказывается, чтоOrder
класс сам попадет в базу (через стандартный API системы), возьмет необходимые данные, создаст экземпляр класса Manager и вернет его.
Три. Можно ли создать метод для любого класса
public static function get (int $ id): self
который просто создаст свой собственный объект со всеми его зависимостями? так что каждый раз, когда вы не получаете доступ к уровню, который занимается получением данных и инициализацией объекта и его зависимостей.
Большая просьба, подробно опишите, как правильно разработать приложение, разбив его на слои? Какие обязанности и зоны ответственности должны быть у каждого уровня?