DTO - Tại sao ta cần đến nó
dto
2
PHP
98
Laravel
42
White

Nguyễn Thế Huy viết ngày 09/07/2021

Chào các bạn, hôm nay chúng ta sẽ bàn một chút về việc thao tác với dữ liệu trong Laravel, cụ thể là DTO

DTO là gì ?

DTO viết tắt cho Data transfer object, hay gọi nôm na, là đối tượng truyền dẫn dữ liệu.

Vì sao cần sử dụng đến DTO ?

Với sự phát triển mạnh mẽ của microservice như hiện nay, dữ liệu được luân chuyển thường xuyên giữa các service trên hệ thống. Bản thân từng ứng dụng cũng cần chuyển đổi dữ liệu giữa các module của nó. Điều đó đặt ra một số vấn đề:

  • Làm cách nào để đảm bảo dữ liệu di chuyển giữa các service/module luôn đảm bảo tính chính xác, toàn vẹn, hạn chế tối đa các side effect ?. Rộng hơn ra làm sao để chúng ta luôn tự tin với dữ liệu được nhận và đảm bảo tính thống nhất ?
  • Dữ liệu được truyền nhận giữa các service thường là json. Đối với PHP, cách làm hầu hết là chuyển đổi từ json sang array. Điều đó tiếp tục đặt ra thách thức ràng buộc về kiểu dữ liệu, khó khăn đối với các công cụ analytic trong việc cảnh báo lỗi. Điều này tuy nhỏ, nhưng có thể gây ra nhiều bug trong quá trình xử lý. Việc chuyển đổi dữ liệu thuần túy sang một object class còn đem đến nhiều lợi thế sau này khi cần thao tác, mở rộng.
  • Dữ liệu cần được che giấu và đóng gói. Việc có một object trong việc truyền nhận dữ liệu giúp dev kiểm soát dữ liệu tốt hơn trong hệ thống
  • Chúng ta cần chia tách việc biến đổi dữ liệu với business logic, đảm bảo tính seperation of concern, cũng như loosely coupling giữa các module / hệ thống.

Triển khai DTO

Cái tên Transfer đã nói lên tất cả. Về cơ bản, DTO chỉ mang trong nó dữ liệu, và các phương thức để serialize / unserialize. Trái ngược với DAO (Data Access Object) DTO sẽ không chứa trong nó bất cứ business logic nào.

Thông thường với Laravel, chúng ta sẽ implement DAO thông qua repository pattern. Với DTO, cơ chế hoàn toàn tương tự

Sau đây là một ví dụ siêu đơn giản về việc sử dụng DTO để lưu dữ liệu sản phẩm

Chúng ta có một class DTO chuyển đổi dữ liệu từ request

ProductDTO

<?php

class ProductDTO
{
    public string $title;

    public function __construct(array $data) {
        $this->title = $data['title'] ?? null;
    }

    public function getTitle() {
        return $this->title;
    }
  //Có thể implement thêm các phương thức validate, transform dữ liệu tùy theo yêu cầu của bài toán
}

Một controller để lưu dữ liệu đơn giản
ProductController

public function store(Request $request) {
    //Lấy dữ liệu từ request gửi lên
      $requestData = $request->all();
      // tạo ra request DTO
      $requestDTO = new ProductDTO($requestData);
      // sau khi có DTO, tiến hành xử lý lưu dữ liệu. Lúc này có thể sử dụng DAO ProductRepository. 
    //ProductRepository sẽ access qua $requestDTO->getTitle();
      $response = $this->productRepository->create($requestDTO);
    // Chỗ này chúng ta có thể biến đổi response thông qua một responseDTO nữa ngay trong hàm create của ProductRepository. Ở đây mình giả định chúng ta có thể return response này về cho client luôn
      return $response; 
    }

Với cách thiết kế trên giúp chúng ta tự tin hơn về việc dữ liệu được nhận khi nó được pass qua các module khác nhau trong hệ thống. Việc này càng quan trọng hơn khi xu thế microservice đang rất phổ biến hiện nay

Cám ơn các bạn đã đọc bài, nếu có gì chưa đúng mong các bạn comment để mình cập nhật.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Thế Huy

13 bài viết.
69 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
34 8
Hi cả nhà, đây là bài viết đầu tiên của mình trên Kipalog nên có gì không hay mong các bạn thông cảm :D Realtime là gì ? Như chúng ta đều đã biế...
Nguyễn Thế Huy viết gần 4 năm trước
34 8
White
28 6
Xin chào mọi người :D Trong bài viết này mình sẽ trình bày một cách cơ bản để ứng dụng kỹ thuật Http Live Streaming (HLS) để play video trên web, ...
Nguyễn Thế Huy viết hơn 3 năm trước
28 6
White
27 6
Bài toán Machine Learning và những ứng dụng của nó đang ngày càng trở nên nổi bật trong những năm trở lại đây. Với sự phát triển thần tốc của cấu ...
Nguyễn Thế Huy viết hơn 2 năm trước
27 6
Bài viết liên quan
White
4 3
Đặt vấn đề Khi viết RestApi ta chỉ thường chọn một số thông tin để truyền về client. Ví dụ như thông tin user thì không cần truyền password chẳng h...
Tuấn Nguyễn viết hơn 3 năm trước
4 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
13 bài viết.
69 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!