Xử lý Form Validation trong Laravel từ A - Z
Laravel form validation là một phần rất quan trọng trong phát triển ứng dụng web. Việc đảm bảo tính chính xác và an toàn của dữ liệu đầu vào từ người dùng là rất cần thiết để ngăn ngừa các lỗ hổng bảo mật và giúp ứng dụng hoạt động một cách chính xác.
Trong Laravel, việc xử lý form và validation được đơn giản hóa và linh hoạt hơn bao giờ hết. Laravel cung cấp một số công cụ để xử lý form và validation một cách dễ dàng, bao gồm các đối tượng form request, các rule validation có sẵn, các thông báo lỗi validation và nhiều hơn nữa.
Trong bài viết này, chúng ta sẽ đi sâu vào các khái niệm và công cụ liên quan đến validation dữ liệu và xử lý form trong Laravel. Chúng ta sẽ tìm hiểu về cách sử dụng form request để xử lý và validate dữ liệu, cách sử dụng các rule validation có sẵn để kiểm tra tính hợp lệ của dữ liệu, cách tùy chỉnh các thông báo lỗi validation, và nhiều hơn nữa.
Nếu bạn đang phát triển một ứng dụng web bằng Laravel và muốn đảm bảo tính chính xác và an toàn của dữ liệu đầu vào, thì bài viết này sẽ là một hướng dẫn tuyệt vời cho bạn. Hãy bắt đầu tìm hiểu ngay bây giờ!
Bài viết này được đăng tại [free tuts .net]
1. Validation trong Laravel là gì ?
Validation date trong Laravel là một quy tắc kiểm tra hợp lệ của dữ liệu trong một trường ngày tháng. Nó được sử dụng để đảm bảo rằng người dùng đã nhập giá trị ngày tháng hợp lệ theo định dạng được chỉ định.
Để sử dụng quy tắc kiểm tra validation date trong Laravel, bạn có thể sử dụng phương thức "date" của lớp Validator trong Laravel. Ví dụ:
$request->validate([ 'ngay_sinh' => 'required|date' ]);
Trong ví dụ này, "ngay_sinh" là tên của trường chứa giá trị ngày sinh của người dùng. Quy tắc "required" được sử dụng để đảm bảo rằng người dùng đã nhập giá trị cho trường này, và quy tắc "date" được sử dụng để kiểm tra xem giá trị đó có phải là một ngày tháng hợp lệ hay không. Nếu giá trị không phải là ngày tháng hợp lệ, Laravel sẽ trả về một thông báo lỗi để hiển thị cho người dùng.
2. Sử dụng Validation trong Laravel từ cơ bản tới nâng cao
Tạo một form HTML để người dùng nhập liệu
Để tạo một form HTML để người dùng nhập liệu trong Laravel, bạn có thể sử dụng Blade template engine của Laravel. Đầu tiên, bạn cần tạo một route để xử lý việc submit form. Sau đó, bạn có thể tạo một Blade view chứa form HTML.
Ví dụ, đây là cách để tạo một form HTML đơn giản trong Laravel:
Trước tiên, tạo một route để xử lý submit form:
// routes/web.php Route::post('/submit-form', 'FormController@submitForm');
Tiếp theo, tạo một controller để xử lý việc submit form:
// app/Http/Controllers/FormController.php namespace App\Http\Controllers; use Illuminate\Http\Request; class FormController extends Controller { public function submitForm(Request $request) { // Xử lý dữ liệu form ở đây } }
Cuối cùng, tạo một Blade view chứa form HTML:
<!-- resources/views/form.blade.php --> <form method="POST" action="/submit-form"> @csrf <div> <label for="name">Name:</label> <input type="text" id="name" name="name"> </div> <div> <label for="email">Email:</label> <input type="email" id="email" name="email"> </div> <div> <label for="message">Message:</label> <textarea id="message" name="message"></textarea> </div> <button type="submit">Submit</button> </form>
Trong form này, chúng ta sử dụng phương thức POST để submit form, và chúng ta đã thêm một @csrf directive để bảo vệ ứng dụng của chúng ta khỏi tấn công Cross-Site Request Forgery (CSRF). Mỗi input của form đều có một name attribute tương ứng với key của mảng khi form được submit. Khi form được submit, các giá trị này sẽ được gửi đến route mà chúng ta đã tạo trong controller để xử lý.
Tạo một route để xử lý yêu cầu POST từ form
Để tạo một route để xử lý yêu cầu POST từ form bạn có thể sử dụng phương thức Route::post(). Đây là cách để tạo một route POST đơn giản trong Laravel:
Route::post('/submit-form', 'FormController@submitForm');
Trong ví dụ trên, chúng ta đang tạo một route POST có đường dẫn là /submit-form, và nó sẽ được xử lý bởi phương thức submitForm trong FormController. Bạn cần tạo một controller mới hoặc sử dụng một controller đã có để xử lý yêu cầu này.
Sau khi tạo route, khi người dùng submit form, dữ liệu sẽ được gửi đến route này để xử lý. Bạn có thể truy cập dữ liệu đó thông qua đối tượng Request trong hàm xử lý của controller. Ví dụ:
// FormController.php namespace App\Http\Controllers; use Illuminate\Http\Request; class FormController extends Controller { public function submitForm(Request $request) { $name = $request->input('name'); $email = $request->input('email'); $message = $request->input('message'); // Xử lý dữ liệu form ở đây } }
Trong ví dụ trên, chúng ta đang sử dụng phương thức input của đối tượng Request để lấy giá trị của các trường trong form. Bạn có thể sử dụng các phương thức khác của đối tượng Request để lấy các thông tin khác như headers, cookies, files, v.v.
Sử dụng Method store của PostController trong Validation
Method store trong PostController trong Validation là một hàm để xử lý việc lưu trữ bài đăng (post). Đây là một trong các method chuẩn trong Resource Controller của Laravel và nó được gọi khi người dùng submit một form để tạo mới một bài đăng.
Đây là một ví dụ về cách triển khai method store trong PostController:
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Post; class PostController extends Controller { /** * Lưu bài đăng mới vào database. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // Kiểm tra xác thực dữ liệu đầu vào từ form $validatedData = $request->validate([ 'title' => 'required|max:255', 'content' => 'required', ]); // Lưu bài đăng mới vào database $post = new Post; $post->title = $validatedData['title']; $post->content = $validatedData['content']; $post->save(); // Chuyển hướng đến trang hiển thị bài đăng vừa tạo return redirect('/posts/' . $post->id); } }
Trong ví dụ trên, chúng ta đang sử dụng phương thức validate của đối tượng Request để kiểm tra dữ liệu đầu vào từ form. Nếu dữ liệu đầu vào không hợp lệ (không đáp ứng các điều kiện được chỉ định), Laravel sẽ tự động trả về một thông báo lỗi cho người dùng.
Sau khi kiểm tra dữ liệu đầu vào, chúng ta tạo một bài đăng mới và lưu nó vào database sử dụng Eloquent ORM của Laravel. Cuối cùng, chúng ta chuyển hướng người dùng đến trang hiển thị bài đăng vừa tạo.
Lưu ý rằng trước khi sử dụng method store, bạn cần đảm bảo rằng đã thiết lập các route và view tương ứng để người dùng có thể submit form và xem danh sách bài đăng.
Sau khi đã hiểu các bước cơ bản để sử dụng Validation trong Laravel, bạn có thể tìm hiểu các bước nâng cao sau đây để tùy chỉnh các quy tắc validation của mình:
Tạo các thông báo lỗi tùy chỉnh
bạn có thể tạo các thông báo lỗi tùy chỉnh bằng cách sử dụng các file ngôn ngữ và các luật kiểm tra trong các class Form Request. Sau đây là một số bước để tạo các thông báo lỗi tùy chỉnh trong Laravel:
Tạo file ngôn ngữ tùy chỉnh: Tạo một file ngôn ngữ mới trong thư mục resources/lang với tên và định dạng phù hợp cho ngôn ngữ mà bạn muốn sử dụng. Ví dụ, nếu bạn muốn tạo thông báo lỗi cho tiếng Anh, hãy tạo file en/validation.php.
Định nghĩa các thông báo lỗi: Trong file ngôn ngữ, định nghĩa các thông báo lỗi cho các luật kiểm tra mà bạn muốn sử dụng. Ví dụ:
// resources/lang/en/validation.php return [ 'required' => 'The :attribute field is required.', 'email' => 'The :attribute must be a valid email address.', 'min' => [ 'string' => 'The :attribute must be at least :min characters.', ], ];
Sử dụng các thông báo lỗi trong Form Request: Trong các class Form Request của Laravel, sử dụng phương thức messages() để ghi đè các thông báo lỗi mặc định và sử dụng các thông báo lỗi tùy chỉnh của bạn. Ví dụ:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class ExampleRequest extends FormRequest { public function rules() { return [ 'name' => 'required', 'email' => 'required|email', 'password' => 'required|min:8', ]; } public function messages() { return [ 'name.required' => __('validation.required'), 'email.required' => __('validation.email'), 'email.email' => __('validation.email'), 'password.required' => __('validation.min.string'), 'password.min' => __('validation.min.string'), ]; } }
Trong ví dụ trên, __('validation.required') được sử dụng để lấy thông báo lỗi tương ứng với luật kiểm tra required từ file ngôn ngữ validation.php. Bạn có thể sử dụng các tên và giá trị của thông báo lỗi tùy chỉnh của bạn trong messages().
Các thông báo lỗi tùy chỉnh sẽ được sử dụng khi xảy ra lỗi trong quá trình kiểm tra Form Request.
Sử dụng Rule Objects
Tạo một Rule Object mới: Để tạo một Rule Object mới, bạn có thể sử dụng lệnh artisan make:rule hoặc tạo một class mới và triển khai giao diện Illuminate\Contracts\Validation\Rule. Ví dụ:
php artisan make:rule CustomRule
Sau đó, một file CustomRule.php sẽ được tạo trong thư mục app/Rules.
Triển khai giao diện Rule: Trong class Rule, bạn cần triển khai phương thức passes($attribute, $value) để kiểm tra xem giá trị của trường có hợp lệ hay không. Nếu giá trị hợp lệ, phương thức passes() sẽ trả về true, ngược lại trả về false. Bạn có thể thêm các thông báo lỗi tùy chỉnh bằng cách triển khai phương thức message().
use Illuminate\Contracts\Validation\Rule; class CustomRule implements Rule { public function passes($attribute, $value) { // Kiểm tra giá trị của trường return true; } public function message() { return 'The :attribute is invalid.'; } }
Sử dụng Rule Object trong Form Request: Trong Form Request của Laravel, sử dụng phương thức rules() để xác định các luật kiểm tra cho các trường. Để sử dụng Rule Object, bạn có thể truyền nó vào phương thức Rule:: và gọi constructor của class Rule Object. Ví dụ:
use App\Rules\CustomRule; public function rules() { return [ 'field' => [ 'required', new CustomRule() ], ]; }
Trong ví dụ trên, Rule Object CustomRule được sử dụng để kiểm tra giá trị của trường field. Bạn có thể sử dụng các Rule Object khác để kiểm tra các trường khác.
Sử dụng Rule Objects trong Laravel giúp bạn xây dựng các luật kiểm tra phức tạp hơn và tái sử dụng chúng ở nhiều nơi khác nhau. Bên cạnh đó, tính năng này cũng giúp mã nguồn của bạn trở nên dễ đọc và dễ bảo trì hơn.
Sử dụng Custom Rule Objects
Custom Rule Objects (Đối tượng Luật kiểm tra tùy chỉnh) là một tính năng của Laravel cho phép bạn tạo ra các luật kiểm tra tùy chỉnh cho các trường trong request. Điều này giúp bạn xây dựng các luật kiểm tra phức tạp hơn và tái sử dụng chúng ở nhiều nơi khác nhau.
Để sử dụng Custom Rule Objects trong Laravel, bạn có thể thực hiện các bước sau:
Tạo một Custom Rule Object: Để tạo một Custom Rule Object, bạn có thể sử dụng lệnh artisan make:rule để tạo một class mới trong thư mục app/Rules. Ví dụ:
php artisan make:rule CustomRule
Sau đó, Laravel sẽ tạo một class CustomRule với một phương thức passes() để kiểm tra giá trị của trường và một phương thức message() để trả về thông báo lỗi.
Triển khai phương thức passes(): Trong phương thức passes(), bạn có thể thực hiện kiểm tra giá trị của trường. Nếu giá trị của trường hợp lệ, phương thức passes() sẽ trả về true, ngược lại trả về false.
use Illuminate\Contracts\Validation\Rule; class CustomRule implements Rule { public function passes($attribute, $value) { // Thực hiện kiểm tra giá trị của trường // Nếu giá trị hợp lệ, trả về true // Ngược lại, trả về false } public function message() { return ':attribute không hợp lệ.'; } }
Sử dụng Custom Rule Object trong Form Request: Để sử dụng Custom Rule Object trong Form Request, bạn có thể đưa nó vào mảng các luật kiểm tra của trường trong phương thức rules().
use App\Rules\CustomRule; public function rules() { return [ 'field_name' => ['required', new CustomRule], ]; }
Trong ví dụ trên, Custom Rule Object CustomRule được sử dụng để kiểm tra giá trị của trường field_name. Nếu giá trị của trường không hợp lệ, Laravel sẽ trả về thông báo lỗi được định nghĩa trong phương thức message() của Custom Rule Object.
Sử dụng Custom Rule Objects trong Laravel giúp bạn xây dựng các luật kiểm tra phức tạp hơn và tái sử dụng chúng ở nhiều nơi khác nhau. Bên cạnh đó, tính năng này cũng giúp mã nguồn của bạn trở nên dễ đọc và dễ bảo trì hơn.
Custom Validation Rule Objects (Đối tượng Luật kiểm tra tùy chỉnh) là một tính năng trong Laravel cho phép bạn tạo các luật kiểm tra tùy chỉnh cho các trường trong request. Tương tự như Custom Rule Objects, Custom Validation Rule Objects cho phép bạn xây dựng các luật kiểm tra phức tạp hơn và tái sử dụng chúng ở nhiều nơi khác nhau.
Để sử dụng Custom Validation Rule Objects trong Laravel, bạn có thể thực hiện các bước sau:
Tạo một Custom Validation Rule Object: Để tạo một Custom Validation Rule Object, bạn có thể sử dụng lệnh artisan make:rule với tham số --validator để tạo một class mới trong thư mục app/Rules. Ví dụ:
php artisan make:rule CustomValidationRule --validator
Sau đó, Laravel sẽ tạo một class CustomValidationRule kế thừa từ class Illuminate\Contracts\Validation\Rule với các phương thức cần thiết để thực hiện việc kiểm tra giá trị của trường và trả về thông báo lỗi.
Thực hiện phương thức passes(): Trong phương thức passes(), bạn có thể thực hiện kiểm tra giá trị của trường. Nếu giá trị của trường hợp lệ, phương thức passes() sẽ trả về true, ngược lại trả về false.
use Illuminate\Contracts\Validation\Rule; class CustomValidationRule implements Rule { public function passes($attribute, $value) { // Thực hiện kiểm tra giá trị của trường // Nếu giá trị hợp lệ, trả về true // Ngược lại, trả về false } public function message() { return ':attribute không hợp lệ.'; } }
Sử dụng Custom Validation Rule Object trong Form Request: Để sử dụng Custom Validation Rule Object trong Form Request, bạn có thể đưa nó vào mảng các luật kiểm tra của trường trong phương thức rules().
use App\Rules\CustomValidationRule; public function rules() { return [ 'field_name' => ['required', new CustomValidationRule], ]; }
Trong ví dụ trên, Custom Validation Rule Object CustomValidationRule được sử dụng để kiểm tra giá trị của trường field_name. Nếu giá trị của trường không hợp lệ, Laravel sẽ trả về thông báo lỗi được định nghĩa trong phương thức message() của Custom Validation Rule Object.
Sử dụng Custom Validation Rule Objects trong Laravel giúp bạn xây dựng các luật kiểm tra phức tạp hơn và tái sử dụng chúng ở nhiều nơi khác nhau. Bên cạnh đó, tính năng này cũng giúp mã nguồn
3. Xử lý form validate trong Laravel
Trong Laravel, để xử lý validate dữ liệu trong form, bạn có thể sử dụng một số phương pháp sau:
Sử dụng validate method trong controller:
Trong phương pháp này, bạn có thể sử dụng validate method để xác thực dữ liệu. Method này sẽ kiểm tra các trường trong request và trả về các lỗi nếu có. Nếu có lỗi, bạn có thể redirect lại trang trước đó với thông báo lỗi. Ví dụ:
public function store(Request $request) { $validatedData = $request->validate([ 'name' => 'required|max:255', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', ]); // Code để lưu dữ liệu vào CSDL }
Sử dụng Form Request Validation:
Trong phương pháp này, bạn có thể tạo một Form Request Validation để kiểm tra dữ liệu. Form Request Validation sẽ kiểm tra dữ liệu và trả về các lỗi nếu có. Nếu có lỗi, Laravel sẽ redirect lại trang trước đó với thông báo lỗi. Ví dụ:
Đầu tiên, bạn cần tạo một Form Request Validation:
php artisan make:request StoreUserRequest
Sau đó, trong file app/Http/Requests/StoreUserRequest.php, bạn có thể khai báo luật kiểm tra cho các trường dữ liệu:
public function rules() { return [ 'name' => 'required|max:255', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', ]; }
Cuối cùng, bạn có thể sử dụng Form Request Validation trong Controller:
public function store(StoreUserRequest $request) { // Code để lưu dữ liệu vào CSDL }
Với cả hai phương pháp trên, nếu có lỗi xảy ra, Laravel sẽ tự động redirect lại trang trước đó và hiển thị các thông báo lỗi. Bạn có thể sử dụng withErrors method để hiển thị thông báo lỗi trong trường hợp không redirect được. Ví dụ:
public function store(Request $request) { $validatedData = $request->validate([ 'name' => 'required|max:255', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', ]); // Code để lưu dữ liệu vào CSDL return back()->withErrors(['message' => 'Có lỗi xảy ra.']); }
Sử dụng các rule mặc định của Laravel:
Laravel hỗ trợ nhiều rule mặc định để kiểm tra dữ liệu, bao gồm cả kiểm tra dữ liệu đầu vào, định dạng email, độ dài tối thiểu, tối đa, duy nhất, và nhiều hơn nữa. Ví dụ:
public function store(Request $request) { $request->validate([ 'name' => 'required|max:255', 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', 'phone_number' => 'required|numeric|digits_between:10,11', ]); // Code để lưu dữ liệu vào CSDL }
Tạo các rule tùy chỉnh:
Nếu các rule mặc định không đủ để kiểm tra dữ liệu của bạn, bạn có thể tạo các rule tùy chỉnh. Để tạo rule tùy chỉnh, bạn có thể sử dụng make:rule Artisan command để tạo một class rule mới. Ví dụ:
php artisan make:rule Uppercase
Sau đó, bạn có thể sử dụng class rule này trong controller:
public function store(Request $request) { $request->validate([ 'name' => ['required', 'max:255', new Uppercase], 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', ]); // Code để lưu dữ liệu vào CSDL }
Hiển thị thông báo lỗi:
Nếu validation fails, Laravel sẽ tự động redirect lại trang trước đó và hiển thị các thông báo lỗi. Bạn có thể customize các thông báo lỗi này trong file resources/lang/[ngon_ngu]/validation.php. Ví dụ:
'custom' => [ 'name.required' => 'Tên là bắt buộc.', 'name.max' => 'Tên không được vượt quá 255 ký tự.', 'email.required' => 'Email là bắt buộc.', 'email.email' => 'Email không đúng định dạng.', 'email.unique' => 'Email đã tồn tại.', 'password.required' => 'Mật khẩu là bắt buộc.', 'password.min' => 'Mật khẩu phải có ít nhất 8 ký tự.', ],
Kết bài viết
Trong bài viết này, chúng ta đã tìm hiểu cách xử lý form và validation trong Laravel. Chúng ta đã thảo luận về cách sử dụng Request và Form Request để lấy và xác thực dữ liệu đầu vào. Chúng ta cũng đã đề cập đến cách sử dụng các rule mặc định của Laravel, cũng như tạo các rule tùy chỉnh để kiểm tra dữ liệu. Cuối cùng, chúng ta cũng tìm hiểu cách hiển thị thông báo lỗi cho người dùng.
Việc xử lý form và validation trong Laravel là một phần rất quan trọng trong việc phát triển ứng dụng web. Nó giúp đảm bảo rằng dữ liệu được nhập vào là hợp lệ và an toàn. Sử dụng các phương pháp và kỹ thuật chúng ta đã tìm hiểu trong bài viết này, bạn có thể dễ dàng xử lý form và validation trong Laravel, giúp cho ứng dụng của bạn trở nên chắc chắn và đáng tin cậy hơn.
Hy vọng bài viết này đã giúp ích cho bạn trong việc hiểu và áp dụng các kỹ thuật xử lý form và validation trong Laravel. Nếu bạn có bất kỳ câu hỏi hoặc góp ý nào, hãy để lại comment để chúng ta có thể thảo luận thêm về chủ đề này.
Một số câu hỏi lien quan tới xử lý form và Validation trong Laravel
1 .Làm thế nào để tạo một form trong Laravel?
Để tạo một form trong Laravel, bạn có thể sử dụng các helper function như Form::open() và Form::close(). Ví dụ:
{!! Form::open(['url' => '/post', 'method' => 'post']) !!} <div class="form-group"> {!! Form::label('title', 'Tiêu đề') !!} {!! Form::text('title', '', ['class' => 'form-control']) !!} </div> <div class="form-group"> {!! Form::label('content', 'Nội dung') !!} {!! Form::textarea('content', '', ['class' => 'form-control']) !!} </div> {!! Form::submit('Lưu', ['class' => 'btn btn-primary']) !!} {!! Form::close() !!}
2. Làm thế nào để sử dụng Form Request để xác thực dữ liệu trong Laravel?
Để sử dụng Form Request để xác thực dữ liệu trong Laravel, bạn cần tạo một class Form Request mới bằng cách sử dụng
php artisan make:request [tên request]
Sau đó, bạn có thể sử dụng class này để xác thực dữ liệu đầu vào trong controller. Ví dụ:
public function store(PostRequest $request) { $post = new Post(); $post->title = $request->input('title'); $post->content = $request->input('content'); $post->save(); return redirect('/posts')->with('success', 'Bài viết đã được lưu thành công'); }
3. Làm thế nào để tạo các rule tùy chỉnh trong Laravel?
Để tạo các rule tùy chỉnh trong Laravel, bạn có thể sử dụng command để tạo một class rule mới.
php artisan make:rule [tên rule]
Sau đó, bạn có thể sử dụng class này để kiểm tra dữ liệu đầu vào. Ví dụ:
public function rules() { return [ 'name' => ['required', 'max:255', new Uppercase], 'email' => 'required|email|unique:users,email', 'password' => 'required|min:8', ]; }