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:
-
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. -
Dane są zamapowane, ale ponieważ
$request->validated()
zwracają tablicę, nie można wymusić typu danych przekazywanych docreateUser
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!