В проекте на Laravel использую DTO. Нужно обновить модель пользователя, но в реквесте могут прийти не полные данные, тогда выкидывается ошибка Too few arguments, потому что в методе fromRequest не хватает аргументов при разворачивании
...$request->validated()
, а сделать поле null по умолчанию нельзя. Как это поправить?
DTO
abstract readonly class DTO
{
public function toArray(): array
{
return get_object_vars($this);
}
public static function fromRequest(FormRequest $request): static
{
return new static(...$request->validated());
}
}
final readonly class UpdateUserDTO extends DTO
{
public function __construct(
public ?string $name,
public ?string $email,
) {
}
}
UpdateUserRequest
class UpdateUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => ['string', 'max:255'],
'email' => ['string', 'max:255', 'email', 'unique:users'],
];
}
}
UserController
final class UserController extends Controller
{
public function update(int $userId, UpdateUserRequest $request): UserResource
{
return UserResource::make(
$this->userService->update($userId, UpdateUserDTO::fromRequest($request))
);
}
}
UserService
final class UserService
{
public function update(int $userId, UpdateUserDTO $userDTO): User
{
$user = User::findOrFail($userId);
$user->update([
'name' => $userDTO->name,
'email' => $userDTO->email,
]);
return $user;
}
}