Cách hoạt động
Việc xử lý lỗi validation phía máy chủ trong Inertia khác với form truyền thống điều khiển bằng XHR, nơi bạn phải bắt lỗi validation từ response422 và tự cập nhật trạng thái lỗi của form — bởi Inertia không bao giờ nhận response 422. Thay vào đó, Inertia hoạt động gần giống việc submit form tải toàn bộ trang thông thường. Cách thức như sau:
Trước tiên, bạn gửi form bằng Inertia. Nếu có lỗi validation phía máy chủ, bạn không trả các lỗi đó dưới dạng response JSON 422. Thay vào đó, bạn redirect người dùng ở phía máy chủ trở lại trang form trước đó và flash các lỗi validation vào session. Một số framework như Laravel thực hiện việc này tự động.
Tiếp theo, bất cứ khi nào các lỗi validation này tồn tại trong session, chúng sẽ tự động được chia sẻ với Inertia và trở thành page props ở phía client để bạn hiển thị trong form. Vì props có tính reactive, lỗi sẽ tự động được hiển thị khi quá trình submit form hoàn tất.
Cuối cùng, vì ứng dụng Inertia không bao giờ tạo response 422, Inertia cần một cách khác để xác định response có chứa lỗi validation hay không. Inertia thực hiện việc này bằng cách kiểm tra object page.props.errors xem có lỗi nào tồn tại không. Nếu có lỗi, callback onError() của request sẽ được gọi thay cho callback onSuccess().
Chia sẻ lỗi
Để lỗi validation phía máy chủ có thể sử dụng ở phía client, framework phía máy chủ phải chia sẻ chúng thông qua properrors. Các adapter chính thức của Inertia, chẳng hạn adapter Laravel, tự động thực hiện việc này. Với framework khác, bạn có thể phải tự cấu hình. Hãy tham khảo tài liệu của adapter phía máy chủ tương ứng để biết thêm thông tin.
Hiển thị lỗi
Vì lỗi validation được cung cấp cho phía client dưới dạng props của page component, bạn có thể hiển thị có điều kiện dựa trên việc chúng có tồn tại hay không. Hãy nhớ rằng khi sử dụng các server adapter chính thức của Inertia (chẳng hạn adapter Laravel), properrors sẽ tự động có sẵn trên trang.
$page.props.errors.
Khôi phục dữ liệu input
Mặc dù cách xử lý lỗi trong Inertia tương tự submit form tải toàn bộ trang, Inertia còn mang lại nhiều lợi ích hơn. Thực tế, bạn thậm chí không cần tự điền lại dữ liệu input cũ của form. Khi xảy ra lỗi validation, người dùng thường được redirect trở lại trang form trước đó. Mặc định, Inertia tự động giữ lại state của component cho các requestpost, put, patch và delete. Vì vậy, toàn bộ dữ liệu input cũ của form vẫn giữ nguyên như thời điểm người dùng submit form.
Do đó, công việc còn lại duy nhất là hiển thị các lỗi validation bằng prop errors.
Error bag
Nếu đang sử dụng form helper, bạn không cần dùng error bag vì lỗi validation được tự động giới hạn phạm vi trong object form đã tạo request. Với các trang có nhiều hơn một form, xung đột có thể xảy ra khi hiển thị lỗi validation nếu hai form dùng chung tên field. Ví dụ, hãy hình dung một form “tạo công ty” và một form “tạo người dùng” đều có fieldname. Vì cả hai form đều hiển thị lỗi validation page.props.errors.name, việc phát sinh lỗi validation cho field name ở bất kỳ form nào cũng khiến lỗi xuất hiện ở cả hai form.
Để giải quyết vấn đề này, bạn có thể sử dụng “error bag”. Error bag giới hạn phạm vi các lỗi validation được máy chủ trả về bên trong một key duy nhất dành riêng cho form đó. Tiếp tục ví dụ trên, bạn có thể dùng error bag createCompany cho form thứ nhất và createUser cho form thứ hai.
page.props.errors.createCompany và page.props.errors.createUser.