API Resource và xây dựng REST API

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 28 tháng 5, 2025

Laravel hỗ trợ xây dựng RESTful API một cách dễ dàng và rõ ràng thông qua hệ thống API Resource. Việc sử dụng API Resource giúp định dạng đầu ra thống nhất, dễ kiểm soát dữ liệu trả về và bảo vệ các trường nhạy cảm. Bài học này sẽ hướng dẫn cách tạo và sử dụng Resource để trả về dữ liệu JSON chuẩn.

1 Tạo API Resource

Laravel cung cấp lệnh để tạo một lớp Resource:

php artisan make:resource PostResource

Tệp sẽ được tạo tại: app/Http/Resources/PostResource.php.

2 Định nghĩa định dạng JSON trong Resource

Mở file PostResource.php và định nghĩa các trường muốn trả về:

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'title' => $this->title,
            'slug' => $this->slug,
            'excerpt' => $this->excerpt,
            'created_at' => $this->created_at->toDateTimeString(),
        ];
    }
}

Lưu ý: Không nên trả về toàn bộ $this->resource nếu có trường nhạy cảm như user_id, content, updated_at,...

3 Trả về dữ liệu bằng Resource

Trong controller (ví dụ: Api\PostController), bạn có thể trả về dữ liệu bằng Resource:

use App\Http\Resources\PostResource;

public function show(Post $post)
{
    return new PostResource($post);
}

4 Trả về danh sách nhiều bài viết

Dùng collection() để bao gói nhiều đối tượng:

public function index()
{
    $posts = Post::latest()->paginate(10);
    return PostResource::collection($posts);
}

5 Đăng ký route API

Trong routes/api.php:

use App\Http\Controllers\Api\PostController;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{post}', [PostController::class, 'show']);

Ví dụ cụ thể

Request:

GET /api/posts

Response:

{
  "data": [
    {
      "title": "Giới thiệu Laravel",
      "slug": "gioi-thieu-laravel",
      "excerpt": "Laravel là một framework PHP mạnh mẽ...",
      "created_at": "2025-05-25 10:22:35"
    },
    ...
  ],
  "links": { ... },
  "meta": { ... }
}

Bài tập thực hành

  • Tạo route GET /api/posts trả về danh sách bài viết.
  • Tạo PostResource chỉ trả về các trường: title, slug, excerpt, created_at.
  • Thêm GET /api/posts/{id} để trả về chi tiết một bài viết theo định dạng JSON.
  • Đảm bảo các trường nhạy cảm (như content, user_id,...) không hiển thị.

Kết luận

API Resource trong Laravel giúp bạn dễ dàng kiểm soát cấu trúc và nội dung phản hồi JSON, đảm bảo bảo mật và thống nhất dữ liệu đầu ra. Khi xây dựng API chuyên nghiệp, đây là công cụ không thể thiếu để đảm bảo chuẩn RESTful và dễ tích hợp với frontend hoặc mobile app.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ