• Czas czytania ~3 min
  • 10.10.2023

Wprowadzenie

Obiekt transferu danych (DTO) to wzorzec, który przy prawidłowym użyciu może poprawić jakość i łatwość konserwacji aplikacji. W tym artykule dowiemy się, dlaczego warto używać DTO w swoich aplikacjach i jak to zrobić w Laravel.

Co to jest obiekt

transferu danych Obiekt transferu danych (DTO) to wzorzec projektowy używany do przesyłania danych między systemami oprogramowania lub warstwami w architekturze oprogramowania. Jest to prosty obiekt zawierający zestaw danych, zazwyczaj w postaci właściwości lub pól, który reprezentuje określoną jednostkę lub koncepcję w systemie. Głównym celem DTO jest oddzielenie różnych warstw lub komponentów systemu oprogramowania, umożliwiając im komunikację i wymianę danych bez konieczności znajomości szczegółów wzajemnej implementacji.

Podsumowując, DTO to prosty obiekt, który służy do przesyłania danych między różnymi warstwami lub komponentami systemu oprogramowania, pomagając oddzielić i odizolować te komponenty od siebie.

Dlaczego warto używać DTO

Od małych i prostych baz kodu po duże i złożone, istnieją pewne standardy i wzorce, których możemy użyć, aby upewnić się, że nasze aplikacje mają dobrej jakości kod, są łatwe w utrzymaniu, dostosowywaniu i aktualizowaniu.

Standardy struktury danych odgrywają w tym ogromną rolę. Jeśli znam strukturę danych używaną w kodzie, naprawdę łatwo jest ją utrzymać, a także łatwo ją zmienić i tu właśnie wchodzą DTO.

Powiedzmy, że mam ten kod:

class UserController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser($request->all()),
            Response::HTTP_CREATED
        ]);
    }
}

Nawet to jest prosty fragment kodu, jeśli stworzyłem go rok temu, a teraz muszę zmienić createUser metodę, prawdopodobnie nie będę pamiętał, które dane zwraca metoda$request->all().

Mógłbym to refaktoryzować, aby użyć klasy Custom Request:

class UserController extends Controller
{
    public function store(CreateUserRequest $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser($request->validated()),
            Response::HTTP_CREATED
        ]);
    }
}

Z powyższym kodem, gdybym potrzebował zaktualizować createUser metodę i nie pamiętam, których danych używa, mógłbym przejść do sprawdzeniaCreateUserRequest. Ale to stwarza inne problemy:

  1. walidacja danych jest teraz powiązana z żądaniem HTTP. Jeśli muszę wywołać createUser metodę z poziomu kodu, muszę ponownie ręcznie sprawdzić poprawność danych.

  2. Dane są zamapowane, ale ponieważ $request->validated() zwracają tablicę, nie można wymusić typu danych przekazywanych do createUser metody.

Jeśli zastosujemy tutaj wzorzec DTO, możemy rozwiązać oba opisane powyżej problemy. Zamiast tego możemy mapować i sprawdzać poprawność danych w DTO, więc jeśli muszę wywołać createUser metodę z poziomu mojego kodu, walidacja zostanie wykonana automatycznie, ponieważ muszę przekazać DTO do metody, a także wymusi typ danych, które możemy przekazać do createUser metody, ponieważ teraz będziemy musieli przekazać dla niej określone DTO.

Jak korzystać z obiektów DTO Jak wyjaśniono

powyżej, obiekty DTO mogą być prostymi obiektami do mapowania właściwości. Tak więc najbardziej podstawową implementacją DTO byłoby utworzenie prostej klasy takiej jak ta:Następnie możesz utworzyć DTO z Request:Here:

class CreateUserDTO
{
    public function __construct(
        private string $name,
        private string $email,
        private string $username,
        private string $password
    ) {}
    // Add getters, setters, validation
}

class UserController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        return response()->json([
            $this->service->createUser(new CreateUserDTO(...$request->all())),
            Response::HTTP_CREATED
        ]);
    }
}

new CreateUserDTO(...$request->all()) używamy nazwanych argumentów z PHP 8, aby utworzyć instancję CreateUserDTO.

Dzięki temu rozwiązujemy problemy, które szczegółowo opisaliśmy w ostatniej sekcji. Twój kod ma teraz lepszą jakość i łatwość konserwacji.

Podsumowanie

W tym artykule dowiedzieliśmy się, czym są obiekty transferu danych, dlaczego powinniśmy ich używać w naszych aplikacjach i jak ich używać w Laravel.

Jeśli chcesz zacząć używać DTO w swoich aplikacjach, stworzyłem ten pakiet, który jest łatwym sposobem na rozpoczęcie korzystania z DTO, dostarczając podstawową klasę DTO z walidacją i rzutowaniem typu od razu po wyjęciu z pudełka, a także rzemieślnicze polecenie do tworzenia DTO.

Mam nadzieję, że spodobał Ci się ten artykuł, a jeśli tak, nie zapomnij podzielić się tym artykułem ze znajomymi!! Nara!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297