Laravel Resource API.

Giới thiêu laravel resource.

Laravel resource là chức năng được bổ sung trong Laravel 5.5 dùng để

  • Chuyển đổi data API trả về từ Eloquent models sang dạng JSON
  • Thay đổi, sửa đổi dữ liệu trả về
  • Loại bỏ những dữ liệu không cần thiết
  • Lấy thêm những dữ liệu, nhưng quan hệ cần

Tạo API Resources

Ở đây chúng ta sẽ tạo resources cho model User để test.
Trước tiên chúng ta cần tạo 1 model và resource cho table của chúng ta bằng command

php artisan make:resource User

Sau khi chạy lênh trên sẽ sinh ra foder Resources trong Controller và sẽ tạo ra 1 filr User ( user resource) như hình dưới.

Resource Collections

resource collection dùng để làm việc với dữ liệu là collection. Hiểu đơn giản như việc chuyển đổi 1 bản ghi user về json để trả về thì ta dùng resource, còn chuyển đổi cả 1 list user thì ta sẽ dùng resource collection.
Command tạo resource collection

php artisan make:resource User --collection
hoặc
php artisan make:resource UserCollection

Sử dụng resource

Resource

Tếp theo chúng ta sẽ custom lại phương thức toArray để phù hợp với dữ liệu muốn lấy ta sẽ sửa cho cả resource và resourceCollection để sử dụng phần sau.
Ví dụ: ở bảng use ta muốn lấy Id, name đổi thành userName, email, không lấy cột update_at và cột created_at lấy theo định dạng 'H:i:s d/m/Y' thì sẽ làm như sau:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class User extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'userName' => $this->name,
            'email' => $this->email,
            'createdAt' => $this->created_at ? $this->created_at->format('H:i:s d/m/Y') : null,
        ];
    }
}

Xong rồi, giờ chúng ta sẽ tạo UserController để test nhé. Trước hết ta sẽ thử return về 1 user không sử dụng resource UserControler sẽ như sau.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;

class UserController extends Controller
{
    public function index()
    {
        return User::find(1);
    }
}

và dữ liệu trả về không đúng với những gì ta mong muốn ở trên, created_at không được fomat đúng định dạng, vẫn trả về updated_at và name không được đổi thành UserName.

Giờ ta thử với việc sử dụng resource controller sẽ sửa thành như sau

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Resources\User as UserResource;
use App\User;

class UserController extends Controller
{
    public function index()
    {
        return new UserResource(User::find(1));
    }
}

Kết quả trả về đúng với những gì chúng ta muốn

Resource collection Tếp theo là ta sử dụng resource collection để chuyển đổi cho nhiều dữ liệu ta chỉ cần sửa controller như sau để test

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Resources\User as UserResource;
use App\User;

class UserController extends Controller
{
    public function index()
    {
        return UserResource::collection(User::all());
    }
}

với 1 bản ghi trả về thì ta dùng new UserResource(User::find(1)); còn nhiều bản ghi ta sẽ sử dụng UserResource::collection(User::all());
Kết quả:

Kết bài

Cảm ơn mọi người đã theo dõi.
tài liệu tham khảo : https://laravel.com/docs/7.x/eloquent-resources


All Rights Reserved