Najprostszy wzorzec a zbyt często nie używany. Pomaga zebrać dane w jednego/kilku źródeł i wsadzić do jednego obiektu. Można oczywiście zrobić to array
, ale nie jest znormalizowany. Array wszystko przyjmie i wszystko odda. Pokaże przykład rejestracji użytkownika.
Stwórzmy DTO do rejestracji użytkownika:
readonly class RegisterUser
{
private function __construct(
private string $email,
private string $password
) { }
public static function fromArray(array $data): self
{
return new self(
$data['email'],
$data['password']
);
}
public function getEmail(): string
{
return $this->email;
}
public function getPassword(): string
{
return $this->password;
}
}
Controller i service do obsługi rejestracji
interface UserService
{
public function register(RegisterUser $input): void;
}
readonly class UserController extends Controller
{
public function __construct(private UserService $service)
{
}
public function register(RegistrationRequest $request): Response
{
$dto = RegisterUser::fromArray($request->validated());
$this->service->register($dto);
return response()->noContent();
}
}
Jakie są plusy tego podejścia?
Kod staję się bardziej open/close
. Jeżeli do rejestracji musimy dodać numer telefonu nie ma problemy, modyfikujemy tylko DTO i dane już możemy odebrać w UserService
. Nie musimy dodawać kolejnego parametru w interfejsie i klasie.
Wiadomo jakie dane posiada DTO i jakie typy zwróci.