Skip to main content

CRUD hoàn chỉnh: Laravel + React

Bài này xây một CRUD User tối giản nhưng đủ các trạng thái quan trọng khi đi làm: list, create, edit, validation, loading, success feedback và delete confirmation.

1. Routes

routes/web.php
Dùng resource route giúp backend vẫn giữ routing convention của Laravel. Inertia không yêu cầu client-side router riêng.

2. Form Request

app/Http/Requests/StoreUserRequest.php
app/Http/Requests/UpdateUserRequest.php

3. Controller

app/Http/Controllers/UserController.php
Điểm đáng chú ý: controller không trả JSON. Sau mutation, backend redirect về route đích. Đây là flow tự nhiên của Inertia và giúp validation/authorization tiếp tục nằm ở server.

4. Share flash message

app/Http/Middleware/HandleInertiaRequests.php

5. Type dùng chung

resources/js/types/user.ts

6. Index page

resources/js/pages/Users/Index.tsx

7. Form component dùng lại

resources/js/components/users/UserForm.tsx
Nếu TypeScript version của adapter không export InertiaFormProps theo đúng path bạn đang dùng, hãy để type form ở local project bằng ReturnType<typeof useForm<UserFormData>>. Ý chính của sample là lifecycle, không phụ thuộc vào alias type.

8. Create page

resources/js/pages/Users/Create.tsx

9. Edit page

resources/js/pages/Users/Edit.tsx

Runtime flow cần hiểu

Checklist production

  • Có Policy/Form Request thay vì chỉ disable button phía client.
  • Disable submit trong processing để tránh double submit.
  • Delete phải có confirm hoặc undo pattern.
  • List chỉ select các cột cần dùng.
  • Pagination giữ query string.
  • Flash là feedback ngắn; dữ liệu thật vẫn phải đến từ props mới.
  • Không tự setUsers([...]) sau create/update nếu server redirect đã trả state chuẩn.

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.