24/01/2019, 15:21

Sử dụng Transformers trong Laravel

Thông thường, khi chúng ta tạo ra một JSON Response trong Laravel, chúng ta sẽ sử dụng Model. class User { protected $fillable = [ 'name' , 'email' , 'address' , 'password' , ] ; protected $hidden = [ 'password' , ...

Thông thường, khi chúng ta tạo ra một JSON Response trong Laravel, chúng ta sẽ sử dụng Model.

class User
{
    protected $fillable = [
        'name', 'email', 'address', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];
}

Giả sử chúng ta muốn lấy User đầu tiên dạng JSON, thì có lẽ chúng ta sẽ sử dụng một cách nào đó như sau.

$user = User::find(1);
return $user;

Boom! Bạn nhận JSON response của user đầu đã đăng ký. Nhưng nếu Model thay đổi trong tương lai (ví dụ: đổi address thành user_address) => JSON response cũng thay đổi. Các bên sử dụng API của bạn cũng phải thay đổi theo. Do vậy ta cần một cách khác phù hợp hơn, câu trả lời đó là dùng Transformer.

Về cơ bản transformers cho bạn tạo định JSON response một cách linh động. Ngoài ra ta còn có thể phân trang kết quả, lồng các quan hệ/dữ liệu. Nếu bạn sử dụng Dingo API thì Fractal Transformers được tích hợp sẵn. Giả sử mình chỉ muốn trả về name và email mà không có address.

class UserTransformer extends TransformerAbstract
{
    public function transformWithoutAddress(User $user)
    {
        return [
            'id'            => (int) $user->id,
            'name'          => (string) $user->name,
            'email'         => (string) $user->email,
        ];
    }
}

Sử dụng:

$user = User::find(1);
return (new UserTransformer)->transformWithoutAddress($user);

OK, mọi thứ đều ổn. Nhưng nếu ta muốn trả lại cả address thì sao? Chỉ cần tạo thêm một transformer nữa trong UserTransformer

public function transformWithAddress(User $user)
{
    $data = ['address' => (string) $user->address];
    return array_merge($data, $this->transformWithoutAddress($user));
}

Great! Nếu bây giờ bạn thay đổi thuộc tính của User từ address thành user_address thì ta chỉ việc thay đổi trong Transformer và các bên sử dụng API của ta không bị ảnh hưởng gì cả.

Trong bài viết này mình đã đề cập đến tạo JSON response từ Transformer. Một trong những tính linh hoạt của việc sử dụng transformer là nó không phải là trực tiếp bắt nguồn từ các models. Do đó, phiên bản API hoặc tạo transformer cho cùng một model với các mục đích khác nhau sẽ dễ dàng hơn.

https://medium.com/@haydar_ai/how-to-start-using-transformers-in-laravel-4ff0158b325f

Bài liên quan

Tạo Restful API để xác thực sử dụng Passport trong Laravel

Ngày nay API còn được biết như là Web Services. Web Services rất quan trọng khi bạn tạo web hoặc đang phát triển mobile app. Bạn sẽ cần tạo API cho người lập trình mobile app. Như chúng ta biết thì Laravel ngày phổ biến hơn có lẽ bởi tạo API. Nhưng nếu bạn là người mới bắt đầu và bạn không biết ...

Trần Trung Dũng viết 09:47 ngày 20/07/2019

Sử dụng Transformers trong Laravel

Thông thường, khi chúng ta tạo ra một JSON Response trong Laravel, chúng ta sẽ sử dụng Model. class User { protected $fillable = [ 'name' , 'email' , 'address' , 'password' , ] ; protected $hidden = [ 'password' , ...

Hoàng Hải Đăng viết 15:21 ngày 24/01/2019

Sử dụng Localization trong Laravel với VueJS

Đa ngôn ngữ là tính năng quan trọng đối với mỗi website và luôn được các developer quan tâm khi sử dụng các framework. Đối với Laravel Framework, chúng ta sẽ sử dụng Localization. Laravel cung cấp cho chúng ta một cách đơn giản để ứng dụng đa ngôn ngữ. Các file language được đặt tại folder ...

Bùi Văn Nam viết 15:57 ngày 12/08/2018

API Authentication sử dụng JWT trong Laravel

Hôm nay mình xin giới thiệu tới các bạn một ví dụ về API Authentication trong Laravel sử dụng JWT. Đây là một ví dụ mà mình thấy khá hữu ích trong việc xác thực người dùng trong các ứng dụng web. JSON Web Token (JWT) là một tiêu chuẩn mở (RFC 7519) định nghĩa một cách nhỏ gọn và an toàn để ...

Trịnh Tiến Mạnh viết 15:47 ngày 12/08/2018

Hướng dẫn sử dụng notification trong Laravel

Nếu bạn muốn tạo một ứng dụng webstie với những ý tưởng hay để giải quyết những vấn đề trong cuộc sống thì ứng dụng của bạn phải có giao diện thật đẹp, thao tác đơn giác và tiện ích đối với người dù ng để ứng dụng của các bạn được nhiều người biết đến hơn. Nếu bạn đang xây dựng ứng dụng với ...

Tạ Quốc Bảo viết 15:29 ngày 12/08/2018
0