Tìm hiểu API Resource trong Laravel
Bài đăng này đã không được cập nhật trong 4 năm
Giới thiệu
- API (Application Programming Interface) là một giao diện mà một hệ thống máy tính hay ứng dụng cung cấp để cho các yêu cầu dịch vụ có thể được tạo ra từ các chương trình máy tính khác và cho phép dữ liệu có thể được trao đổi qua lại giữa chúng thông qua các phương thức
GET
,POST
,PUT
,DELETE
,PATCH
. - Khi khi dựng một API, bạn cần chuyển đổi dữ liệu Eloquent model và JSON được trả về bởi ứng dụng của người dùng. Lớp Laravel resource cho phép bạn chuyển đổi dễ dàng giửa model và model collection trong JSON.
Tạo Resource
- Để tạo một lớp resorce, bạn có thể sử dụng cửa sổ lệnh Artisan VD:
php artisan make:resource Product
. - Mặc định, resource sẽ được sinh ra trong thư mục
app/Http/Resource
trong project của bạn. Resource sử dụng lớpIlluminate\Http\Resource\Json\JsonResource
.
Resource Collections
- Ngoài việc tạo resource và chuyển đổi models, resource có thể chuyển đổi các collection của model. Điều này cho phép dữ liệu trả về bao gồm các liên kết liên quan đến collection của resource.
- Để tạo một resource collection, bạn nên sử dụng tham số
--collection
ở cuối câu lệnh tạo resource. Hoặc có thể thể thêm hậu tốCollection
sau tên resource, collection resource sử dụng lớpIlluminate\Http\Resource\Json\ResourceCollection
.
php artisan make:resource Products --collection
php artisan make:resource ProductCollection
Lớp JsonResource
- Một lớp resource đại diện cho một model cần được chuyển đổi trong một cấu trúc JSON.
- Tạo lớp resource Product
php artisan make:resource Product
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class Product extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'slug' => $this->slug,
'price' => $this->price,
'quantity' => $this->quantity,
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
}
- Mỗi một lớp resource định nghĩa sẵn phương thức
toArray
trả về một mảng thuộc tính của đối tượng nên được chuyển đổi thành JSON khi gửi phản hổi response. - Chúng ta có thể truy cập thuộc tính của model thông biến
$this
.
use App\Http\Resources\Product as ProductResource;
use App\Models\Product;
Route::get('/product', function () {
return new ProductResource(Product::find(1));
});
Resource Collections
- Nếu bạn muốn trả về một collection của resource hoặc một paginate, bạn có thể sử dụng phương thức collection khi tạo một thể hiện resource trong route hoặc controller.
use App\Http\Resources\Product as ProductResource;
use App\Models\Product;
Route::get('/products', function () {
return ProductResource::collection(Product::all());
});
- Chú ý VD trên không cho phép bổ sung dữ liệu nào khi được trả về với collection. Nếu muốn bổ sung resource, bạn cần tạo một Collection
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class ProductCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection,
'links' => [
'self' => 'link-value',
],
];
}
}
- Sau khi định nghĩa resource collection, nó có thể được gọi ở route hoặc controller.
use App\Http\Resources\ProductCollection;
use App\Models\Product;
Route::get('/products', function () {
return new ProductCollection(User::all());
});
- Khi trả về resource collection từ một route.
- Thuộc tính
$preserveKey
cho phép bạn biết các khóa collection có được giữ nguyên khôngpublic $preserveKeys = true;
- Thuộc tính
$collects
cho phép bạn thay đổi mapping mặc định của Collection
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class UserCollection extends ResourceCollection
{
/**
* The resource that this resource collects.
*
* @var string
*/
public $collects = 'App\Http\Resources\Member';
}
Tài liệu tham khảo
All rights reserved