Dưới đây là Bài 19, tiếp nối trực tiếp sau Request.
Bài này sử dụng luôn các bảng và Model đã có trong khóa học (users, posts, categories, tags, profiles, countries), không tạo thêm cấu trúc dữ liệu mới.
Ở bài trước, chúng ta đã học cách lấy dữ liệu từ người dùng thông qua Request.
Tuy nhiên, dữ liệu người dùng nhập vào không phải lúc nào cũng hợp lệ. Họ có thể để trống tiêu đề, nhập email sai định dạng hoặc chọn một Category không tồn tại.
Laravel cung cấp Validation để kiểm tra dữ liệu trước khi lưu vào cơ sở dữ liệu.
Validation là một trong những tính năng được sử dụng nhiều nhất trong mọi dự án Laravel.
Validation là gì?
Validation là quá trình kiểm tra dữ liệu đầu vào.
Ví dụ:
Tiêu đề không được để trống.
Nội dung phải có ít nhất 20 ký tự.
Email phải đúng định dạng.
Category phải tồn tại.
Số điện thoại không được vượt quá số ký tự quy định.
Nếu dữ liệu không hợp lệ, Laravel sẽ tự động quay lại Form và hiển thị lỗi.
validate()
Trong Controller:
use Illuminate\Http\Request;
Ví dụ:
public function store(Request $request)
{
$request->validate([
'title' => 'required',
'content' => 'required',
]);
}
Nếu người dùng bỏ trống một trong hai trường, Laravel sẽ tự động trả về lỗi.
required
Bắt buộc phải nhập.
'title' => 'required'
min
Độ dài tối thiểu.
'content' => 'required|min:20'
Người dùng phải nhập ít nhất 20 ký tự.
max
Giới hạn tối đa.
'title' => 'required|max:255'
Đây cũng là giới hạn phổ biến của kiểu dữ liệu string trong cơ sở dữ liệu.
Kiểm tra định dạng Email.
Ví dụ cập nhật User:
$request->validate([
'email' => 'required|email',
]);
Laravel sẽ kiểm tra địa chỉ email có đúng định dạng hay không.
numeric
Chỉ cho phép số.
Ví dụ với số điện thoại trong bảng profiles:
$request->validate([
'phone' => 'required|numeric',
]);
exists
Kiểm tra dữ liệu có tồn tại trong cơ sở dữ liệu.
Ví dụ khi thêm Post:
$request->validate([
'category_id' =>
'required|exists:categories,id',
]);
Nếu Category không tồn tại, Validation sẽ thất bại.
array
Người dùng chọn nhiều Tag.
$request->validate([
'tags' => 'array',
]);
Kiểm tra từng Tag:
$request->validate([
'tags.*' =>
'exists:tags,id',
]);
Laravel sẽ kiểm tra từng ID trong mảng.
unique
Kiểm tra dữ liệu chưa tồn tại.
Ví dụ:
$request->validate([
'email' =>
'required|email|unique:users,email',
]);
Không cho phép trùng Email.
Validation khi tạo Post
Ví dụ:
$request->validate([
'title' =>
'required|max:255',
'content' =>
'required|min:20',
'category_id' =>
'required|exists:categories,id',
]);
Sau khi Validation thành công:
$post = Post::create([
'title' => $request->title,
'content' => $request->content,
'category_id' => $request->category_id,
'user_id' => 1,
]);
Tiếp theo:
$post->tags()->sync(
$request->tags
);
Validation giúp đảm bảo dữ liệu trước khi lưu.
Validation cập nhật Profile
Ví dụ:
$request->validate([
'phone' =>
'required|numeric',
'address' =>
'required|max:255',
]);
Sau đó:
$profile->update([
'phone' => $request->phone,
'address' => $request->address,
]);
Hiển thị lỗi
Blade:
<input
type="text"
name="title"
value="{{ old('title') }}">
Thông báo lỗi:
@error('title')
<div class="text-danger">
{{ $message }}
</div>
@enderror
old() giúp giữ lại dữ liệu người dùng đã nhập sau khi Validation thất bại.
Validation Rule thường dùng
| Rule | Ý nghĩa |
|---|---|
| required | Bắt buộc nhập |
| nullable | Có thể để trống |
| string | Chuỗi ký tự |
| numeric | Chỉ gồm số |
| integer | Số nguyên |
| boolean | true / false |
| Định dạng Email | |
| min | Giá trị tối thiểu |
| max | Giá trị tối đa |
| unique | Không được trùng |
| exists | Phải tồn tại |
| array | Kiểu mảng |
Tùy chỉnh thông báo lỗi
Có thể truyền thêm mảng thông báo:
$request->validate(
[
'title' => 'required',
],
[
'title.required' =>
'Vui lòng nhập tiêu đề.',
]
);
Laravel sẽ hiển thị thông báo theo nội dung bạn định nghĩa.
Tổng kết
Trong bài này chúng ta đã học:
Validation là gì.
validate().Các Rule phổ biến.
Validation với Post.
Validation với Profile.
Validation mảng Tag.
Hiển thị lỗi bằng
@error.Giữ dữ liệu bằng
old().
Validation giúp bảo vệ dữ liệu, giảm lỗi và mang lại trải nghiệm tốt hơn cho người dùng.
Bài tập
Thêm Validation khi tạo Post.
Kiểm tra
category_idbằngexists.Kiểm tra
titlekhông vượt quá 255 ký tự.Kiểm tra
contentcó ít nhất 20 ký tự.Kiểm tra tất cả Tag được chọn đều tồn tại.
Hiển thị lỗi bằng
@error.Giữ lại dữ liệu bằng
old()khi Validation thất bại.
Bài tiếp theo
Ở Bài 20, chúng ta sẽ tìm hiểu Upload File, cách tải hình ảnh lên máy chủ, lưu đường dẫn vào cơ sở dữ liệu và hiển thị ảnh trong ứng dụng Laravel.
Bài 19 hoàn thiện quy trình xử lý Form cơ bản trong Laravel: Request → Validation → Lưu dữ liệu. Ở bài tiếp theo, người học sẽ bổ sung khả năng Upload File, một chức năng rất phổ biến trong các hệ thống Blog, CMS và ứng dụng quản lý nội dung.




Không có nhận xét nào:
Đăng nhận xét