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

Chú ý khi sử dụng Laravel Fractal Transformers

Laravel Fractal Transformers dùng để custom lại các trường dữ liệu trước khi tra về view hoặc json. Dưới đây là 1 số chú ý.

Tối ưu hóa API của bạn với Laravel Fractal Transformers! Bài viết này sẽ đi sâu vào những điểm quan trọng cần lưu ý khi sử dụng Laravel Fractal để biến đổi dữ liệu, giúp bạn xây dựng các phản hồi API gọn gàng, hiệu quả và dễ quản lý hơn. Khám phá các thực tiễn tốt nhất, tránh những cạm bẫy thường gặp và nâng cao chất lượng API Laravel của bạn.

Khi sử dụng include để thêm các trường dữ liệu liên quan trong transformers ta cần chú ý

1. Trong transformer gốc khai báo protected

protected $availableIncludes  = ['comments'];

Hoặc 

protected $defaultIncludes = ['comments'];

2. Phải tạo 1 transformers liên kết và use nó vào transformers đang thao tác

use App\Transformers\CommentTransformer;

3. Trong controller xử lý use cái Transformers gốc vào

use App\Transformers\UserPresenterTransformer;

4. Trong hàm xử lý ở controller nếu không sử dụng include ở Transformers gốc thì viết như sau:

$user = User::where('id', 3)->with('comments')->first();
$user = $this->userTransform->transform($user);

5. Nếu Transformers gốc có dùng include thì ở hàm xử lý trong controller ta viết như sau

$user = User::where('id', 3)->with('comments')->first();
$user = fractal()->item($user) // collection
        ->transformWith(new UserPresenterTransformer)
        ->parseIncludes('comments')
        ->toArray();

Ở đoạn code trên nếu $user là 1 offject thì ta sử dụng item, nếu $user là 1 mảng nhiều offject thì ta sử dụng collection

6. Muốn xóa bỏ key data mà Transformers trả về thì trong hàm xử lý ở controller ta viết như sau

$user['data']['comments'] = $user['data']['comments']['data'];

Toàn bộ code hàm xử lý như sau :

public function all()
    {
        $user = User::where('id', 3)->with('comments')->first();
        // $user = User::paginate(5);
        // $user = $this->userTransform->transform($user);
        $user = fractal()->item($user) // collection
        ->transformWith(new UserPresenterTransformer)
        ->parseIncludes('comments')
        ->toArray();
        $user['data']['comments'] = $user['data']['comments']['data']; 
        return response()->json(["status"=>200, "message"=>"Thành công", "result"=>$user['data']]);
    }

Toàn bộ code xử lý trong Transformers gốc như sau:


namespace App\Transformers;

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

/**
 * Class UserPresenterTransformer.
 *
 * @package namespace App\Transformers;
 */
class UserPresenterTransformer extends TransformerAbstract
{
    /**
     * Transform the UserPresenter entity.
     *
     * @param \App\Entities\UserPresenter $model
     *
     * @return array
     */
    protected $availableIncludes  = ['comments'];

    public function transform(User $model)
    {
        $transform = [
            'id'         => (int) $model->id,
            'fullname' => $model->full_name,

            /* place your other model properties here */

            'created_at' => date('H:i:s d/m/Y', strtotime($model->created_at)),
            'updated_at' => date('H:i:s d/m/Y', strtotime($model->updated_at))
        ];
        return $transform;
    }

    public function includeComments(User $model)
    {
        $comments = $model->comments;
        
        return $this->collection($comments, new CommentTransformer);
    }
}

Toàn bộ code xử lý trong Transformers liên kết ta viết như sau :


namespace App\Transformers;

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

/**
 * Class CommentTransformer.
 *
 * @package namespace App\Transformers;
 */
class CommentTransformer extends TransformerAbstract
{
    /**
     * Transform the Comment entity.
     *
     * @param \App\Entities\Comment $model
     *
     * @return array
     */
    public function transform(Comment $model)
    {
        $transform = [
            'id'         => (int) $model->id,
            'content' => $model->content,
            /* place your other model properties here */

            'created_at' => date('H:i:s d/m/Y', strtotime($model->created_at)),
            'updated_at' => date('H:i:s d/m/Y', strtotime($model->updated_at))
        ];
        return $transform;
    }
}

Trên đây là 1 ví dụ nhỏ, trong thực tế sẽ xử lý nhiều trường dữ liệu hơn trong cả Transformers và trong Controller, tùy vào từng dự án để sử dụng cho hiệu quả. Chúc bạn thành công.