Data Transfer Objects (DTO)

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.

Scroll to Top