- Authors
- Name
- Nguyễn Đức Xinh
- 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
- Cài đặt ứng dụng Laravel trên máy của bạn. Nếu chưa cài có thể xem ở đây: Hướng dẫn cài đặt ứng dụng Laravel
- Cài đặt Database MySQL.
- Cài đặt API routing. Có thể xem hướng dẫn tại đây: Hướng dẫn cài đặt API trong Laravel
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
}
-
GET /api/products
- Lấy danh sách tất cả sản phẩm -
PUT /api/products/{id}
- Cập nhật một sản phẩm -
GET /api/products/{id}
- Lấy thông tin một sản phẩm cụ thể -
DELETE /api/products/{id}
- Xóa một sản phẩm
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.