afagorn
@afagorn
Пытаюсь стать хорошим веб-программистом

Может ли DTO(Data Transfer Object) иметь обязательные свойства через конструктор?

Насколько я понял, то суть DTO в том чтобы заменить большое количество аргументов в методе на более удобную структуру. Например, избежать такой ситуации function addUser(100, null, null, null, null, null, 'address'); Вместо этого создать объект DTO, заполнить только нужное свойство и передать только объект как аргумент

Может ли DTO иметь конструктор, который сделает какие-то свойства обязательными для заполнения? Или все свойства должны быть всегда необязательными? Если мне нужно чтобы при создании моей сущности были какие-то обязательные параметры, а какие-то нет, то как быть? Валидировать обязательность параметров уже в клиентском коде?

Пример моего использования DTO
class UserData {
  public $id;
  public $name;
  public $address;
 *и еще куча свойств*
}

class User {
  private $id;
  private $name;
  private $address;
  *и еще много свойств*

  __construct($id, $name, $address, *и еще много свойств*) {
    $this->id = $id;    
    $this->name = $name;    
    $this->address = address;    
  }

  *всякие геттеры и сеттеры*
}

class UserService {
  public function createUser(UserData $userData) {
    if(empty($userData->id)) {return false;}

    return new User(
      $userData->id,
      $userData->name,
      $userData->address
      *и еще там много полей*
    )
  }
}

class UserController()
{
  public function create($request) {
    *валидация реквеста*

   $user =  (new UserService())->create(new UserData(
     $request->id, 
     $request->name,
     $request->address,
     *другие данные*
   ))
  }
}
  • Вопрос задан
  • 532 просмотра
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka
Токсичный шарпист
Да, может, и даже должен обязательные поля получать через конструктор или фабричный метод.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы