Возвращать из сервисов 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

  • 446