Возвращать из сервисов Entity или DTO?
Преимущества
1. Нельзя изменить состояние сущности из контроллера
2. Не будет доступа непосредственно к состоянию сущности
3. Не нужно нагружать сущность геттерами
class Deposit
{
public function getState(): DepositState
{
return new DepositState(
$this->id,
$this->status,
// ...
);
}
}
final class DepositService
{
public function create(...)
{
// ...
return $deposit->getState();
}
}
Недостатки
1. Нужно создавать на каждую сущность отдельную DTO
2. Нужно прописывать маппинг сущности на DTO
3. Что делать со вложенными сущностями?
Можно ли использовать репозитории в контроллере?
final class WithdrawalController
{
public function approve()
{
$withdrawal = $this->withdrawalRepository->getById(...);
}
}
final class WithdrawalController
{
public function approve()
{
$withdrawal = $this->withdrawalService->getById(...);
}
}
final class WithdrawalService
{
public funtion getById(...)
{
return $this->withdrawalRepository->getById(...);
}
}
Преимущества
1. Не нужно создавать proxy-сервисы
Недостатки
1. Не получится запретить использовать сущности в контроллере
2. Если нужна будет дополнительная логика после выборки - нужно будет дублировать ее в контроллерах
3. Лишний доступ ко всем методам репозитория из контроллера
PHP Code Conventions
By Volodymyr Kupriienko
PHP Code Conventions
- 474