Подпишитесь на наши новости, чтобы не
пропустить важные обновления и выпуск новых продуктов
Одна из книг которая кардинально повлияла на разработку в проектах это - "Чистая архитектура" Роберта Мартина. Основной посыл книги, ваша система не должна зависеть от инфраструктуры (фраймворка), сначала код - база данных потом. Мы попробовали следовать данным правилам, и действительно код стал чище и качественнее, мы смогли менять персистентность не затрагивая большей части системы. В коде приложения появились Repositories, Entities, появились слои приложения Presentation, Application, Domain и Infrastructure. На каждом уровне приложения действуют свои правила разработки, есть в слое Domain обязательно ООП, то в Presentation обычные функции Helpers и Views. Боевой проект в котором использовали данных подход это Smoking-Shop, нам без особых проблем удалось вынести внутренний пакет PartScanner по работе с прайс-листами на отдельный сервис не меняя поведения системы.
Domain Layer - Доменный слой, ядро нашей системы. Вообще диаграмма доменной модели сформированной на этапе проектирование является основной для создания Entities (Сущностей), Domain Services (Доменных сервисов), Domain Interfaces (Контракты для взаимодействия с внешним миром).
Пример модели:
<?php
namespace Demo\Domain\Task;
class Task
{
public function __construct(private int $id, private string $name)
{
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
}
Application Layer - Слой приложения содержащий Use Cases (варианты использования) приложения, бизнес логика строится на основе бизнес-процессов выявленных также на этапе проектирования.
Пример команды:
<?php
namespace Application\CreateTask;
//CreateTaskCommand.php
class CreateTaskCommand
{
public function __construct(private string $name)
{
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
}
// CreateTaskHandler.php
class CreateTaskHandler extends ApplicationHandler
{
public function handle(ApplicationCommandInterface $command): void
{
/**
* Логика создания, результат созданная сущность
*/
$this->recordsEvents->record(new TaskWasCreatedEvent($task));
}
}
Presentation Layer - Уровень предназначенный для взаимодействия с пользователями сайта, это реализация контроллеров, хелперов, шаблонов и представлений. Основной строительный элемент на данном уровне это - Module (Модуль). Любую страницу можно представить в виде набора модулей, - меню сайта, карточка товара или слайдер на главной. Основное преимущество это переиспользование в любой части сайта или даже в других проектах
Пример контроллера:
<?php
namespace Application\CreateTask;
//CreateTaskCommand.php
class TaskController extends PresentationController
{
public function createTask(name $name): void
{
//commandBus
$this->commandBus->handle(new CreateTaskCommand($name));
return $this->createResponse();
}
}
Infrastructure Layer - Инфраструктурный уровень, это уровень взаимодействия с внешним миром, с другим сервисами, с базой данных.
Пример репозитория:
<?php
namespace Infrastructure\Repositories\Task;
class TaskRepository implements TaskRepositoryInterface
{
public function findByCriteria(TaskSearchCriteriaInterface $criteria): TaskCollection
{
/**
* логика получения данных
*/
return new TaskCollection($tasks);
}
}