Laravel Resource API.
Bài đăng này đã không được cập nhật trong 4 năm
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