lt;pgt;Dưới đây là lt;stronggt;Bài 19lt;/stronggt;, tiếp nối trực tiếp sau lt;stronggt;Requestlt;/stronggt;.lt;/pgt;lt;pgt;Bài này sử dụng luôn các bảng và Model đã có trong khóa học (lt;stronggt;users, posts, categories, tags, profiles, countrieslt;/stronggt;), không tạo thêm cấu trúc dữ liệu mới.lt;/pgt;lt;pgt;Ở bài trước, chúng ta đã học cách lấy dữ liệu từ người dùng thông qua lt;stronggt;Requestlt;/stronggt;.lt;/pgt;lt;pgt;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.lt;/pgt;lt;pgt;Laravel cung cấp lt;stronggt;Validationlt;/stronggt; để kiểm tra dữ liệu trước khi lưu vào cơ sở dữ liệu.lt;/pgt;lt;pgt;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.lt;/pgt;lt;hr /gt;lt;h1gt;Validation là gì?lt;/h1gt;lt;pgt;Validation là quá trình kiểm tra dữ liệu đầu vào.lt;/pgt;lt;pgt;Ví dụ:lt;/pgt;lt;ulgt;lt;ligt;lt;pgt;Tiêu đề không được để trống.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Nội dung phải có ít nhất 20 ký tự.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Email phải đúng định dạng.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Category phải tồn tại.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Số điện thoại không được vượt quá số ký tự quy định.lt;/pgt;lt;/ligt;lt;/ulgt;lt;pgt;Nếu dữ liệu không hợp lệ, Laravel sẽ tự động quay lại Form và hiển thị lỗi.lt;/pgt;lt;pgt;lt;/pgt;lt;div class=quot;separatorquot; style=quot;clear: both; text-align: center;quot;gt;lt;a href=quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-ut8BtLBrS4iLLCRR2FCC2Z37JNoF6GTFqjPJkz5Zf6kIpoKHCuS02CtK_oymbIn24yQqXiow9cX1ZKu-IkbYiOuhEdfh25UnCf_2YWiyVns-Avn7k1iQ1i-T89gOZwXysbujE0NK32gAVBGQBoqqEvXdzQBPEEi7D_zeQ2ZoUugLRo_IgZCtZhKkZ74/s1536/bai19.pngquot; imageanchor=quot;1quot; style=quot;margin-left: 1em; margin-right: 1em;quot;gt;lt;img border=quot;0quot; data-original-height=quot;1024quot; data-original-width=quot;1536quot; height=quot;213quot; src=quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-ut8BtLBrS4iLLCRR2FCC2Z37JNoF6GTFqjPJkz5Zf6kIpoKHCuS02CtK_oymbIn24yQqXiow9cX1ZKu-IkbYiOuhEdfh25UnCf_2YWiyVns-Avn7k1iQ1i-T89gOZwXysbujE0NK32gAVBGQBoqqEvXdzQBPEEi7D_zeQ2ZoUugLRo_IgZCtZhKkZ74/s320/bai19.pngquot; width=quot;320quot; /gt;lt;/agt;lt;spangt;lt;a name=#39;more#39;gt;lt;/agt;lt;/spangt;lt;/divgt;lt;pgt;lt;/pgt;lt;hr /gt;lt;h1gt;validate()lt;/h1gt;lt;pgt;Trong Controller:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;use Illuminate\Http\Request;
lt;/codegt;lt;/pregt;lt;pgt;Ví dụ:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;public function store(Request $request)
{
$request-gt;validate([
#39;title#39; =gt; #39;required#39;,
#39;content#39; =gt; #39;required#39;,
]);
}
lt;/codegt;lt;/pregt;lt;pgt;Nếu người dùng bỏ trống một trong hai trường, Laravel sẽ tự động trả về lỗi.lt;/pgt;lt;hr /gt;lt;h1gt;requiredlt;/h1gt;lt;pgt;Bắt buộc phải nhập.lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;#39;title#39; =gt; #39;required#39;
lt;/codegt;lt;/pregt;lt;hr /gt;lt;h1gt;minlt;/h1gt;lt;pgt;Độ dài tối thiểu.lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;#39;content#39; =gt; #39;required|min:20#39;
lt;/codegt;lt;/pregt;lt;pgt;Người dùng phải nhập ít nhất 20 ký tự.lt;/pgt;lt;hr /gt;lt;h1gt;maxlt;/h1gt;lt;pgt;Giới hạn tối đa.lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;#39;title#39; =gt; #39;required|max:255#39;
lt;/codegt;lt;/pregt;lt;pgt;Đây cũng là giới hạn phổ biến của kiểu dữ liệu lt;code inline=quot;quot;gt;stringlt;/codegt; trong cơ sở dữ liệu.lt;/pgt;lt;hr /gt;lt;h1gt;emaillt;/h1gt;lt;pgt;Kiểm tra định dạng Email.lt;/pgt;lt;pgt;Ví dụ cập nhật User:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;email#39; =gt; #39;required|email#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Laravel sẽ kiểm tra địa chỉ email có đúng định dạng hay không.lt;/pgt;lt;hr /gt;lt;h1gt;numericlt;/h1gt;lt;pgt;Chỉ cho phép số.lt;/pgt;lt;pgt;Ví dụ với số điện thoại trong bảng lt;code inline=quot;quot;gt;profileslt;/codegt;:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;phone#39; =gt; #39;required|numeric#39;,
]);
lt;/codegt;lt;/pregt;lt;hr /gt;lt;h1gt;existslt;/h1gt;lt;pgt;Kiểm tra dữ liệu có tồn tại trong cơ sở dữ liệu.lt;/pgt;lt;pgt;Ví dụ khi thêm Post:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;category_id#39; =gt;
#39;required|exists:categories,id#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Nếu Category không tồn tại, Validation sẽ thất bại.lt;/pgt;lt;hr /gt;lt;h1gt;arraylt;/h1gt;lt;pgt;Người dùng chọn nhiều Tag.lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;tags#39; =gt; #39;array#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Kiểm tra từng Tag:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;tags.*#39; =gt;
#39;exists:tags,id#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Laravel sẽ kiểm tra từng ID trong mảng.lt;/pgt;lt;hr /gt;lt;h1gt;uniquelt;/h1gt;lt;pgt;Kiểm tra dữ liệu chưa tồn tại.lt;/pgt;lt;pgt;Ví dụ:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;email#39; =gt;
#39;required|email|unique:users,email#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Không cho phép trùng Email.lt;/pgt;lt;hr /gt;lt;h1gt;Validation khi tạo Postlt;/h1gt;lt;pgt;Ví dụ:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;title#39; =gt;
#39;required|max:255#39;,
#39;content#39; =gt;
#39;required|min:20#39;,
#39;category_id#39; =gt;
#39;required|exists:categories,id#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Sau khi Validation thành công:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$post = Post::create([
#39;title#39; =gt; $request-gt;title,
#39;content#39; =gt; $request-gt;content,
#39;category_id#39; =gt; $request-gt;category_id,
#39;user_id#39; =gt; 1,
]);
lt;/codegt;lt;/pregt;lt;pgt;Tiếp theo:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$post-gt;tags()-gt;sync(
$request-gt;tags
);
lt;/codegt;lt;/pregt;lt;pgt;Validation giúp đảm bảo dữ liệu trước khi lưu.lt;/pgt;lt;hr /gt;lt;h1gt;Validation cập nhật Profilelt;/h1gt;lt;pgt;Ví dụ:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate([
#39;phone#39; =gt;
#39;required|numeric#39;,
#39;address#39; =gt;
#39;required|max:255#39;,
]);
lt;/codegt;lt;/pregt;lt;pgt;Sau đó:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$profile-gt;update([
#39;phone#39; =gt; $request-gt;phone,
#39;address#39; =gt; $request-gt;address,
]);
lt;/codegt;lt;/pregt;lt;hr /gt;lt;h1gt;Hiển thị lỗilt;/h1gt;lt;pgt;Blade:lt;/pgt;lt;pregt;lt;code class=quot;language-bladequot;gt;lt;input
type=quot;textquot;
name=quot;titlequot;
value=quot;{{ old(#39;title#39;) }}quot;gt;
lt;/codegt;lt;/pregt;lt;pgt;Thông báo lỗi:lt;/pgt;lt;pregt;lt;code class=quot;language-bladequot;gt;@error(#39;title#39;)
lt;div class=quot;text-dangerquot;gt;
{{ $message }}
lt;/divgt;
@enderror
lt;/codegt;lt;/pregt;lt;pgt;lt;code inline=quot;quot;gt;old()lt;/codegt; giúp giữ lại dữ liệu người dùng đã nhập sau khi Validation thất bại.lt;/pgt;lt;hr /gt;lt;h1gt;Validation Rule thường dùnglt;/h1gt;lt;tablegt;lt;theadgt;lt;trgt;lt;thgt;Rulelt;/thgt;lt;thgt;Ý nghĩalt;/thgt;lt;/trgt;lt;/theadgt;lt;tbodygt;lt;trgt;lt;tdgt;requiredlt;/tdgt;lt;tdgt;Bắt buộc nhậplt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;nullablelt;/tdgt;lt;tdgt;Có thể để trốnglt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;stringlt;/tdgt;lt;tdgt;Chuỗi ký tựlt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;numericlt;/tdgt;lt;tdgt;Chỉ gồm sốlt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;integerlt;/tdgt;lt;tdgt;Số nguyênlt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;booleanlt;/tdgt;lt;tdgt;true / falselt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;emaillt;/tdgt;lt;tdgt;Định dạng Emaillt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;minlt;/tdgt;lt;tdgt;Giá trị tối thiểult;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;maxlt;/tdgt;lt;tdgt;Giá trị tối đalt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;uniquelt;/tdgt;lt;tdgt;Không được trùnglt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;existslt;/tdgt;lt;tdgt;Phải tồn tạilt;/tdgt;lt;/trgt;lt;trgt;lt;tdgt;arraylt;/tdgt;lt;tdgt;Kiểu mảnglt;/tdgt;lt;/trgt;lt;/tbodygt;lt;/tablegt;lt;hr /gt;lt;h1gt;Tùy chỉnh thông báo lỗilt;/h1gt;lt;pgt;Có thể truyền thêm mảng thông báo:lt;/pgt;lt;pregt;lt;code class=quot;language-phpquot;gt;$request-gt;validate(
[
#39;title#39; =gt; #39;required#39;,
],
[
#39;title.required#39; =gt;
#39;Vui lòng nhập tiêu đề.#39;,
]
);
lt;/codegt;lt;/pregt;lt;pgt;Laravel sẽ hiển thị thông báo theo nội dung bạn định nghĩa.lt;/pgt;lt;hr /gt;lt;h1gt;Tổng kếtlt;/h1gt;lt;pgt;Trong bài này chúng ta đã học:lt;/pgt;lt;ulgt;lt;ligt;lt;pgt;Validation là gì.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;lt;code inline=quot;quot;gt;validate()lt;/codegt;.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Các Rule phổ biến.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Validation với Post.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Validation với Profile.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Validation mảng Tag.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Hiển thị lỗi bằng lt;code inline=quot;quot;gt;@errorlt;/codegt;.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Giữ dữ liệu bằng lt;code inline=quot;quot;gt;old()lt;/codegt;.lt;/pgt;lt;/ligt;lt;/ulgt;lt;pgt;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.lt;/pgt;lt;hr /gt;lt;h1gt;Bài tậplt;/h1gt;lt;olgt;lt;ligt;lt;pgt;Thêm Validation khi tạo Post.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Kiểm tra lt;code inline=quot;quot;gt;category_idlt;/codegt; bằng lt;code inline=quot;quot;gt;existslt;/codegt;.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Kiểm tra lt;code inline=quot;quot;gt;titlelt;/codegt; không vượt quá 255 ký tự.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Kiểm tra lt;code inline=quot;quot;gt;contentlt;/codegt; có ít nhất 20 ký tự.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Kiểm tra tất cả Tag được chọn đều tồn tại.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Hiển thị lỗi bằng lt;code inline=quot;quot;gt;@errorlt;/codegt;.lt;/pgt;lt;/ligt;lt;ligt;lt;pgt;Giữ lại dữ liệu bằng lt;code inline=quot;quot;gt;old()lt;/codegt; khi Validation thất bại.lt;/pgt;lt;/ligt;lt;/olgt;lt;hr /gt;lt;h2gt;Bài tiếp theolt;/h2gt;lt;pgt;Ở lt;stronggt;Bài 20lt;/stronggt;, chúng ta sẽ tìm hiểu lt;stronggt;Upload Filelt;/stronggt;, 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.lt;/pgt;lt;pgt;Bài 19 hoàn thiện quy trình xử lý Form cơ bản trong Laravel: lt;stronggt;Request → Validation → Lưu dữ liệult;/stronggt;. Ở bài tiếp theo, người học sẽ bổ sung khả năng lt;stronggt;Upload Filelt;/stronggt;, 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.lt;/pgt;