Vanhiep.NET - Chuyên gia Thiết kế Website & Ứng dụng

Cách sử dụng Fractal Transformer trong Laravel

Fractal Transformer là một công cụ mạnh mẽ giúp bạn chuyển đổi và định dạng dữ liệu API trong Laravel một cách nhất quán. Thay vì trả về trực tiếp các Eloquent Model, bạn có thể sử dụng Transformer để kiểm soát chính xác những trường nào được hiển thị, định dạng dữ liệu (ví dụ: ngày tháng, tiền tệ) và thậm chí nhúng các mối quan hệ (relationships).

Mục đích của việc sử dụng Fractal Transformer trong Laravel 

Custum lại các trường dữ liệu trả về view hoặc json khi rest API , các key trả về khác tên các trường trong database thì sẽ dùng cái này để custom lại

 Cài đặt Laravel  Fractal Transformer

 Chạy lệnh sau để cài đặt

composer require spatie/laravel-fractal

Hoặc chạy lệnh sau để cài đặt presenter

composer require culturegr/presenter

Sau khi cài đặt presenter thì chạy lệnh sau để tạo presenter. Khi chạy lệnh này hệ thộng sẽ hỏi bạn có tạo tranformer hay không thì ta nhập yes

php artisan make:presenter UserPresenter

Trong thư mục app sẽ tự động tạo ra 2 file (UserPresenterTransformer.php và UserPresenterPresenter.php) trong 2 thư mục Presenters và Transformers

Presenters  và Transformers có chức năng tương tự nhau, nên dùng cài nào cũng được. Nếu sử dụng Presenters thì có thể tham khảo thêm tài liệu tại đây

Trong file Transformers ta có nội dung test như sau

namespace App\Transformers;

use League\Fractal\TransformerAbstract;
use App\Models\User;

/**
 * Class UserPresenterTransformer.
 *
 * @package namespace App\Transformers;
 */
class UserPresenterTransformer extends TransformerAbstract
{
    /**
     * Transform the UserPresenter entity.
     *
     * @param \App\Entities\UserPresenter $model
     *
     * @return array
     */
    public function transform(User $model)
    {
        return [
            'id'         => (int) $model->id,
            'fullname' => $model->full_name,

            /* place your other model properties here */

            'created_at' => $model->created_at,
            'updated_at' => $model->updated_at
        ];
    }
}

Chèn Transformers vào controllers xử lý

use App\Transformers\UserPresenterTransformer;

Khai báo hàm contructor như sau

 protected $repository;
    protected $userTransform;

    public function __construct(UserRepository $repository, UserPresenterTransformer $userTransform)
    {
        $this->repository = $repository;
        $this->userTransform = $userTransform; 
    }

Khai báo sử dụng ở hàm xử lý như sau

 public function all()
    {
        $user = User::findOrFail(434);
        $user = $this->userTransform->transform($user);
        return response()->json(["status"=>200, "message"=>"Thành công", "result"=>$user]);
    }

Kết quả như sau: 

Lúc này trường full_name đã được custom lại thành fullname

Chúc bạn thành công.


Tùy chỉnh dữ liệu trả về với Fractal Transformer trong Laravel: Hướng dẫn chi tiết

Khi phát triển ứng dụng Laravel, đặc biệt là với các API RESTful, việc kiểm soát và định dạng dữ liệu trả về là vô cùng quan trọng. Đôi khi, tên trường trong cơ sở dữ liệu không phù hợp với tên bạn muốn hiển thị cho người dùng hoặc qua API. Đây chính là lúc Fractal Transformer trở thành công cụ đắc lực.

Mục đích của Fractal Transformer trong Laravel

Fractal Transformer cho phép bạn:

  • Tùy chỉnh các trường dữ liệu trả về: Bạn có thể thay đổi tên các trường dữ liệu, ví dụ từ full_name trong database thành fullname khi trả về cho client.
  • Chuyển đổi kiểu dữ liệu: Đảm bảo dữ liệu được trả về đúng định dạng mong muốn (ví dụ: chuyển đổi sang (int)).
  • Kiểm soát dữ liệu hiển thị: Chỉ trả về những trường dữ liệu cần thiết, giúp giảm kích thước phản hồi và tăng tính bảo mật.
  • Định dạng dữ liệu cho View hoặc JSON API: Dễ dàng định dạng dữ liệu một cách nhất quán cho cả giao diện người dùng và các API.

Cài đặt Laravel Fractal Transformer

Để bắt đầu sử dụng Fractal Transformer, bạn cần cài đặt thư viện cần thiết.

Bạn có thể cài đặt trực tiếp gói spatie/laravel-fractal:

composer require spatie/laravel-fractal

Hoặc sử dụng culturegr/presenter để tạo presenter, bao gồm cả transformer:

composer require culturegr/presenter

Sau khi cài đặt presenter, bạn chạy lệnh sau để tạo một presenter:

php artisan make:presenter UserPresenter

Hệ thống sẽ hỏi bạn có muốn tạo transformer không. Hãy nhập "yes" để tạo cả hai file: UserPresenterTransformer.phpUserPresenterPresenter.php.

Khi đó, trong thư mục app của bạn sẽ tự động tạo ra hai thư mục mới là PresentersTransformers, chứa các file tương ứng.

  • app/Presenters/UserPresenterPresenter.php
  • app/Transformers/UserPresenterTransformer.php

Lưu ý: Cả PresentersTransformers đều có chức năng tương tự nhau. Bạn có thể chọn sử dụng cái nào phù hợp với quy trình làm việc của mình. Nếu bạn muốn tìm hiểu sâu hơn về Presenter, hãy tham khảo tài liệu chính thức của gói culturegr/presenter.


Cấu hình Transformer

Bây giờ, chúng ta sẽ tùy chỉnh nội dung trong file Transformer của mình. Mở file app/Transformers/UserPresenterTransformer.php. Bạn sẽ thấy cấu trúc cơ bản như sau:

namespace App\Transformers;

use League\Fractal\TransformerAbstract;
use App\Models\User;

/**
 * Class UserPresenterTransformer.
 *
 * @package namespace App\Transformers;
 */
class UserPresenterTransformer extends TransformerAbstract
{
    /**
     * Transform the UserPresenter entity.
     *
     * @param \App\Entities\UserPresenter $model
     *
     * @return array
     */
    public function transform(User $model)
    {
        return [
            'id'         => (int) $model->id,
            'fullname' => $model->full_name, // Custom lại tên trường từ full_name sang fullname

            /* place your other model properties here */

            'created_at' => $model->created_at,
            'updated_at' => $model->updated_at
        ];
    }
}

Trong phương thức transform(), bạn định nghĩa cách các trường dữ liệu sẽ được chuyển đổi. Ví dụ, ở đây chúng ta đã thay đổi tên trường full_name từ model thành fullname khi trả về.


Chèn Transformer vào Controller

Để sử dụng Transformer, bạn cần chèn nó vào controller xử lý dữ liệu.

Đầu tiên, thêm use statement vào đầu file controller của bạn:

use App\Transformers\UserPresenterTransformer;

Tiếp theo, khai báo biến và inject Transformer vào hàm __construct():

 protected $repository;
    protected $userTransform;

    public function __construct(UserRepository $repository, UserPresenterTransformer $userTransform)
    {
        $this->repository = $repository;
        $this->userTransform = $userTransform; 
    }

Cuối cùng, gọi Transformer trong hàm xử lý của bạn. Ví dụ, trong một hàm all() để lấy thông tin người dùng:

 public function all()
    {
        $user = User::findOrFail(434);
        $user = $this->userTransform->transform($user); // Áp dụng Transformer
        return response()->json(["status"=>200, "message"=>"Thành công", "result"=>$user]);
    }

Kết quả

Sau khi áp dụng Transformer, khi bạn truy cập API hoặc hiển thị dữ liệu, trường full_name từ cơ sở dữ liệu sẽ được chuyển đổi thành fullname trong kết quả trả về.

[Hình ảnh minh họa kết quả JSON với trường 'fullname']

Chúc mừng bạn đã tùy chỉnh thành công trường dữ liệu! Việc sử dụng Fractal Transformer không chỉ giúp dữ liệu của bạn trở nên gọn gàng, dễ quản lý hơn mà còn cải thiện trải nghiệm cho người dùng và các ứng dụng tiêu thụ API của bạn.