Laravel Framework, form data को validate करने के लिए बहुत सारे validation methods/approach provide कराता है |
Laravel में हम validation को कई तरीके से use कर सकते है | जैसे कि या तो हम Controllers के अंदर method बनाकर कर सकते है या तो एक Form Request class बनाकर incoming request को validate कर सकते है |
इस पोस्ट में हम Laravel में forms को validate करने के different methods को जानेंगे |
Laravel Validation
Laravel में validation create करने के लिए हम पहले Validate Request trait का use करेंगे, जो की हमें various HTTP request को validate करने के लिए convenient methods प्रदान करता है |
सबसे पहले हम एक Laravel का एक project create करेंगे –
composer create-project --prefer-dist laravel/laravel laravel-validation
अब हम इस project को किसी code editor में open कर लेंगे और एक MySQL database या कोई भी एक database create कर लेंगे।
Database को create करने के बाद हम database के credentials को .env file में update कर लेंगे।
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel-validation
DB_USERNAME=root
DB_PASSWORD=
अब हम एक FormController.php नाम का एक controller इस कमांड की help से बनाएंगे।
php artisan make:controller FormController
अब हम इस controller में दो methods बनाएंगे –
<?php
//FormController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FormController extends Controller
{
public function create(){
}
public function store(Request $request){
}
}
अब इसके बाद हम web.php में दो routes create करेंगे –
Route::get('form',[FormController::class,'create'])
->name('form.create');
Route::post('form',[FormController::class,'store'])->name('form.store');
Routes बनाने के बाद हम model और migration create करेंगे। Model और Migrations बनाने के लिए हम इस command का प्रयोग करेंगे –
php artisan make:model Form -m
अब हम database\migrationsमें \[timestamp]_create_forms_table.php file में public function up(){ } method लिखेंगे –
public function up()
{
Schema::create('forms', function (Blueprint $table) {
$table->id();
$table->string('item_name');
$table->string('sku_no');
$table->integer('price');
$table->timestamps();
});
}
आप terminal में इस command का use करके database में tables को create करेंगे –
php artisan migrate
जब हमारा table database में create हो जायेगा तो उसके बाद mass assignment exception को prevent करने के app\Models\Form.php में $fillable property add करेंगे –
protected $fillable = ['item_name','sku_no','price'];
अब हम view folder के अंदर एक layout.blade.php नाम की एक फाइल create करेंगे और उसमे ये code लिखेंगे-
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Laravel Form Validation Example Tutorial(Geeks Partner)</title>
<link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="container">
@yield('content')
</div>
<script src="{{ asset('js/app.js') }}" type="text/js"></script>
</body>
</html>
और उसी view के folder में एक create.blade.php भी बनाएंगे और उसमे भी नीचे दिया गया कोड लिखेंगे और एक form create करेंगे –
<!-- create.blade.php -->
@extends('layout')
@section('content')
<style>
.uper {
margin-top: 40px;
}
</style>
<div class="card uper">
<div class="card-header">
Add Item
</div>
<div class="card-body">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div><br />
@endif
<form method="post" action="{{ route('form.store') }}">
<div class="form-group">
@csrf
<label for="name">Item Name:</label>
<input type="text" class="form-control" name="item_name"/>
</div>
<div class="form-group">
<label for="price">SKU Number :</label>
<input type="text" class="form-control" name="sku_no"/>
</div>
<div class="form-group">
<label for="quantity">Item Price :</label>
<input type="text" class="form-control" name="price"/>
</div>
<button type="submit" class="btn btn-primary">Create Item</button>
</form>
</div>
</div>
@endsection
अब हम FormController में create() method को बनाएंगे –
//FormController.php
public function create(){
return view('create');
}
अब हम http://localhost:800/form से इस फॉर्म को access कर सकते है। हो सकता है की आपका सर्वर किसी और port no पर या किसी और url से access हो रहा हो आप उस url के आगे form लिखकर उस form access कर सकते
Writing Validation Logic
अबतक हम अपना form create कर चुके है। Form create करने के बाद हमने उसके submit होने पर FormController के अंदर store method को कॉल किया है। तो अब उस form की validation logic को store() function में इस तरह लिखेंगे –
//FormController.php
public function store(Request $request){
$validatedData = $request->validate([
'item_name'=>'required|max:255',
'sku_no'=>'required|alpha_num',
'price'=>'required|numeric',
]);
Form::create($validatedData);
return response()->json('Form Submitted Successfully');
}
जैसा कि हम देख सकते है कि हमने validation rules को validate() method में pass किया है और अगर validation fail होता है तो हमे उसका proper response generate होगा। और अगर validation pass होता है तो हमारा controller normally execute होगा और हमारा data save हो जायेगा और हमे एक json response मिलेगा।
अगर हम बिना कुछ fill किये form को submit करेंगे तो हमे error response प्राप्त होगा।
Stopping on first validation failure
कभी कभी हमारी requirement होती है कि जैसे ही हमारे फॉर्म में कोई भी validation fail होती है तो हमारा validation रुक जाये और हमे उसी पर error response मिल जाये। ऐसा करने के लिए हम validation logic के attribute में bail rule assign करते है।
//FormController.php
public function store(Request $request){
$validatedData = $request->validate([
'item_name'=>'bail|required|max:255',
'sku_no'=>'required|alpha_num',
'price'=>'required|numeric',
]);
Form::create($validatedData);
return response()->json('Form Submitted Successfully');
}
Displaying Validation Errors
Laravel users को automatically पिछले location पर redirect कर देगा और सरे validation errors खुद ही सेशन में फ़्लैश हो जायेगा।
हमें view के get route में error message को explicitly bind नहीं करना पड़ता है, Laravel खुद ही session data में errors को check करता है और view में automatically bind कर देता है अगर available होता है तो।
हमारे example में हमने $errors array variable की create.blade.php file में iterate किया है जिस वजह से हमे error दिखाई देगी।
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div><br />
@endif
Form Request Validation in Laravel
अभी तक हमने validation rules को controller में लिखा था। अब हम validation के लिए एक अलग से file create कर सकते है।
जब हमे ज्यादा complex validation apply करना होता है तो हम एक form request बनाते है।
Form Requests, custom request classes होती है जो कि validation logic contain रखती है। Form Request class create करने के लिए make:request Artisan CLI command use करते है।
php artisan make:request FieldRequest
यह command app/Http/Requests फोल्डर के अंदर FieldRequest.php file create कर देगा।
अब हम इस file में validation logic को rules() method में लिखेंगे।
// app/Http/Requests/FieldRequest.php
public function rules()
{
return [
'item_name' => 'bail|required|max:255',
'sku_no'=>'required| alpha_num',
'price'=>'required| numeric'
];
}
हमे FieldRequest.php के authorize() method में true भी return करना होता है। अगर हम plan करते है कि authorization logic हमारे application के दूसरे part में हो तो हम authorize() method में true return करते है।
// app/Http/Requests/FieldRequest.php
public function authorize()
{
return true;
}
अब हमे इन rules को FormController.php के store() function में फिर से नहीं लिखना पड़ेगा।
हमे FormController.php में FieldRequest namespace को import करना पड़ेगा और FormRequest को store() function में dependency injection की तरह pass करना पड़ेगा।
<?php
//FormController.php
namespace App\Http\Controllers;
use App\Http\Requests\FieldRequest;
use App\Models\Form;
use Illuminate\Http\Request;
class FormController extends Controller
{
public function create(){
return view('create');
}
public function store(FieldRequest $request){
$validatedData = $request->validated();
Form::create($validatedData);
return response()->json('Form Submitted Successfully');
}
}
अगर validation fail होता है तो redirect response generate होगा और हमे previous location पर भेज देगा और errors session में flash हो जायेगा और display होगा।
Customizing the Error Messages
हम error messages को messages() method में override करके customize कर सकते है। यह method attribute/rule pairs का array और उससे related error messages return करना चाहिए। और हमारा FieldRequest फाइल कुछ इस तरह दिखेगी –
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class FieldRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, mixed>
*/
public function rules()
{
return [
'item_name' => 'bail|required|max:255',
'sku_no'=>'required|alpha_num',
'price'=>'required|numeric'
];
}
public function messages()
{
return [
'item_name.required'=>'An Item Name is required to fill',
'sku_no.required'=>'An SKU NO is cumpolsory to fill',
'price.required'=>'It is important to fill the pricing details'
];
}
}
हम form को save करके फिर से form में बिना डाटा fill किये submit करेंगे तो हमे custom error message दिखाई देगा। इसी तरह से हम और भी properties के लिए custom error messages create कर सकते है।
Manually Creating Validators
हम Laravel में manually validator भी बना सकते है। अगर हम valid() method को request validate करने के लिए नहीं use करना चाहते है तो हम validator facade का use करके manually validator instance create कर सकते है। facade का make() method एक नया validator instance generate करता है।
<?php
//FormController.php
namespace App\Http\Controllers;
use App\Http\Requests\FieldRequest;
use App\Models\Form;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class FormController extends Controller
{
public function create(){
return view('create');
}
public function store(FieldRequest $request){
// $validatedData = $request->validated();
$validatedData = Validator::make($request->all(),[
'item_name' => 'bail|required|max:255',
'sku_no' => 'required|alpha_num',
'price' => 'required|numeric',
])->validate();
Form::create($validatedData);
return response()->json('Form Submitted Successfully');
}
}
यह custom validator भी हमे same output देगा। अगर हम validator instance को manually बनाना चाहते है और validate() method का automatic redirection का advantage लेना चाहते है तो हम validate() method को existing validator instance पर call कर सकते है।
Laravel Validators के बारे में और detail के साथ जानने के लिए हम Official Documentation को देख सकते है – https://laravel.com/docs/9.x/validation
Other Posts –