Site logo
Authors
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Published on
Published on

Xây dựng CRUD API với Laravel và Sanctum: Hướng Dẫn Quản lý Sản phẩm

Khi phát triển API, Laravel cung cấp một framework mạnh mẽ và linh hoạt để tạo ra các API có khả năng mở rộng và bảo mật. Hướng dẫn này sẽ chỉ bạn cách xây dựng một CRUD API (Create, Read, Update, Delete) để quản lý sản phẩm sử dụng Laravel(version hiện tại là 11) và Sanctum

Yêu cầu

Tạo Model và Migration

Chạy Artisan command để tạo một model Product với file migration:

php artisan make:model Product -m --factory
  • Tham số -m dùng để đồng thời tạo file migration tương ứng với Model

Cập nhật migration

Cập nhật file migration của bảng products trong database/migrations:

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->text('description');
        $table->decimal('price', 10, 2);
        $table->integer('stock');
        $table->timestamps();
    });
}

Chạy migration:

Chạy Artisan command sau để cập nhật table vào Database.

php artisan migrate

Cập nhật Model

Thêm $fillable vào Model Product

Mở file model Product trong app/Models/Product.php và thêm thuộc tính $fillable để định nghĩa các field có thể mass assignable (gán hàng loạt):

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasFactory;

    /**
     * Các thuộc tính có thể gán hàng loạt.
     *
     * @var array
     */
    protected $fillable = ['name', 'description', 'price', 'stock'];
}

Nếu không khai báo đầy đủ fillable, bạn sẽ bị lỗi tương tự như sau khi gán hàng loạt: Add [name] to fillable property to allow mass assignment on [App\Models\Product] Model trong Laravel có khá nhiều tính năng, bạn có thể tìm hiểu thêm tại đây: Laravel Eloquent

Tạo Controller và Request Validation

Tạo một controller và Request Validation với Artisan command sau:

php artisan make:controller ProductController --api --model Product -R
  • Tham số --requests dùng để tạo đồng thời request validation tương ứng. Lưu ý --requests bắt buộc phải đi kèm với tham số: --model

Cập nhật Controller

Cập nhật ProductController với các method CRUD:

<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreProductRequest;
use App\Http\Requests\UpdateProductRequest;
use App\Models\Product;

class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $products = Product::all();
        return response()->json($products);
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(StoreProductRequest $request)
    {
        $product = Product::create($request->all());
        return response()->json($product, 201);
    }

    /**
     * Display the specified resource.
     */
    public function show(Product $product)
    {
        return response()->json($product);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(UpdateProductRequest $request, Product $product)
    {
        $product->update($request->all());
        return response()->json($product);
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Product $product)
    {
        $product->delete();
        return response()->json(null, 204);
    }
}

Cập nhật Request Validation

Ta cần cập method authorize return về true và thêm validation rules cho các field tương tứng với model Product

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreProductRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'description' => 'required|string',
            'price' => 'required|numeric|min:0',
        ];
    }
}

Tương tự với UpdateProductRequest

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateProductRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'price' => 'required|numeric|min:0',
            'stock' => 'required|integer|min:0',
        ];
    }
}

Định nghĩa API Route

Thêm route resource vào routes/api.php:

use App\Http\Controllers\ProductController;

Route::apiResource('products', ProductController::class);

Nếu chỉ muốn người dùng đã xác thực có thể truy cập API này thì bọc middleware auth:sanctum bên ngoài

Route::middleware('auth:sanctum')->group(function () {
    Route::apiResource('products', ProductController::class);
});

Để kiểm tra xem các API đã được đăng ký thành công chưa bằng lệnh sau:

php artisan route:list
GET|HEAD        api/products ..................... products.index › ProductController@index
POST            api/products ..................... products.store › ProductController@store
GET|HEAD        api/products/{product} ............. products.show › ProductController@show
PUT|PATCH       api/products/{product} ......... products.update › ProductController@update
DELETE          api/products/{product} ....... products.destroy › ProductController@destroy

Như vậy là các API đã được đăng ký thành công.

Kiểm tra API

Bạn có thể sử dụng các công cụ như Postman , Insomnia , hoặc curl để kiểm tra API.

Các Endpoint

  • POST /api/products - Tạo một sản phẩm mới
    • Request body (JSON):
{
  "name": "Product001",
  "description": "This is a sample product description.",
  "price": 19.99,
  "category": "Sample Category",
  "stock": 100
}

Laravel CRUD API Postman

  • GET /api/products - Lấy danh sách tất cả sản phẩm Laravel CRUD API Postman

  • PUT /api/products/{id} - Cập nhật một sản phẩm Laravel CRUD API Postman

  • GET /api/products/{id} - Lấy thông tin một sản phẩm cụ thể Laravel CRUD API Postman

  • DELETE /api/products/{id} - Xóa một sản phẩm Laravel CRUD API Postman

Kết luận

Với hướng dẫn này, bạn đã có thể tạo một hệ thống CRUD để quản lý sản phẩm.

Nguồn tài liệu