Насколько я понял, то суть 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,
*другие данные*
))
}
}