Skip to main content

Product CRUD: backend contract mỏng

Backend sample không cố trình diễn architecture pattern. Nó chỉ tạo một contract đủ tốt để Frontend có thể dùng Inertia đúng cách.

Routes

routes/web.php

Migration

database/migrations/xxxx_xx_xx_create_products_table.php
price dùng integer để sample không mang thêm vấn đề floating-point vào phần Frontend.

Index: thiết kế prop theo cost

app/Http/Controllers/ProductController.php
Ba quyết định quan trọng:

products dùng closure

Closure giúp server trì hoãn evaluate prop tới khi Inertia biết request hiện tại có cần key đó hay không. Khi Frontend dùng partial reload, query không cần thiết có thể được bỏ qua.

filters được canonicalize ở server

Frontend không tự suy luận default. Server trả đúng state cuối cùng:
Nhờ vậy URL, pagination và UI không drift.

stats là deferred

Stats hữu ích nhưng không cần để người dùng bắt đầu thao tác với bảng. Vì vậy nó không nên block first paint. rescue: true phù hợp khi stats hỏng không được phép làm cả trang CRUD thất bại.

Store / update: validation vẫn thuộc server

app/Http/Requests/StoreProductRequest.php
Frontend có thể thêm constraint UX nhưng không được biến client thành source of truth cho business validation.

Mutation và redirect

Đây là pattern quan trọng của Inertia:
Bạn không cần setProducts([...products, response.data]) sau create. Server response sau redirect mới là canonical state.

Toggle cho optimistic UX

Frontend sẽ đổi UI trước. Backend vẫn là authority. Nếu request fail, Inertia rollback optimistic page props.

Shared flash

app/Http/Middleware/HandleInertiaRequests.php
Flash phù hợp cho feedback “mutation đã hoàn tất”. recentlySuccessful phù hợp hơn với feedback cục bộ của một form vẫn còn ở cùng page.

Không gửi quá nhiều dữ liệu

Index chỉ select field cần render:
Đừng biến page props thành API dump toàn model. Prop càng lớn, serialization + network + history state càng nặng.

Tài liệu chính thức

Nội dung thực chiến trong bài được xây dựng dựa trên API và nguyên lý của Inertia.js v3 Documentation. Khi áp dụng vào dự án, hãy đối chiếu API cụ thể với tài liệu chính thức theo phiên bản bạn đang sử dụng.