Faenir писал(а): ↑2017.04.05, 22:14
Оригинал только у меня не открывается?
Превышено время ожидания ответа от сайта toptal.com.
Интересно было бы увидеть пример реализации чего-то реального на этой архитектуре (на гитхабе). Например, простенького интернет магазина/каталога.
Вот вы не поверите, но изучая многие ветки этого форума становится понятно, что открытых проектов на такой слоистой архитектуре, правильной, практически нет =)
Сам в поисках примера и приходится перелопачивать кучу кода, отсеивая шлак и забирая самое интересное\красивое на мой взгляд решение.
И пока я изучаю интенсив по ООП с полной уверенностью, что смогу найти ответы на свои вопросы, пока все же проблема конструирования правильной архитектуры остается.
Так вот основной вопрос, конечно в том, как все это дело применять. Лично у меня проблема с расстановкой все по своим местам. Вы написали про пример "интернет-магазин", давайте совместно моделировать такой пример.
Потом, конечно, когда все станет понятно, можно будет посмеяться от глупости вопросов.
Я начну как я это понимаю (буду использовать в примера DI от Yii2 но понимаю, что от него нужно отвязываться).
Получается, что в работе у нас участвуют:
1. Контрллер, в котором происходит взаимодействие с сервисным слоем
2. Сервисный слой
3. Некий репозиторий для соединения сервисного слоя и сущности (например, заказ)
4. Сущность
Сервисный слой, которым я буду пользоваться везде, где мне нужно, в контроллерах, например.
Код: Выделить всё
namespace app\services;
class OrderService {
private $orderRepository;
public function __construct(\app\repositories\OrderRepository $orderRepository) {
$this->orderRepository = $orderRepository;
}
}
В этом сервисном слое будут находится все методы для работы с заказами, верно?
Далее необходимо описать интерфес для репозитория, сам репозиторий и сущность.
Код: Выделить всё
namespace app\interfaces;
interface OrderRepositoryInterface {
public function findOne($id);
}
и сам репозиторий:
Код: Выделить всё
namespace app\repositories;
use app\interfaces\OrderRepositoryInterface;
class OrderRepository implements OrderRepositoryInterface {
public function findOne($id) {
return \app\models\Order::findOne( $id );
}
}
Вопрос: могу ли я в данном случае репозиторием возвращаться AR в котором будут определены методы getId(), getClientId() и так далее, верно? Пока что, на старте, потом пытаться отойти от этого.
Дальше реализую метод в сервисном слое для доступа к данным, например так
Код: Выделить всё
public function getById($id) {
return $this->orderRepository->findOne( $id );
}
верно?
А уже в контрллере я могу сделать что-то вроде
Код: Выделить всё
$order = \Yii::$app->order->getById( 43 );
if( $order->isActive() ) {
\Yii::$app->order->completeOrder($order);
}