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).
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.
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.
Fractal Transformer cho phép bạn:
full_name
trong database thành fullname
khi trả về cho client.(int)
).Để 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.php
và UserPresenterPresenter.php
.
Khi đó, trong thư mục app
của bạn sẽ tự động tạo ra hai thư mục mới là Presenters
và Transformers
, chứa các file tương ứng.
app/Presenters/UserPresenterPresenter.php
app/Transformers/UserPresenterTransformer.php
Lưu ý: Cả Presenters
và Transformers
đề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
.
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ề.
Để 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]);
}
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.