Custom Validation Rule tutorial in Laravel 11
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Add User Data</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-4">
<h1>Add New User</h1>
@if($errors->any())
<ul class="alert alert-danger">
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<form action="{{ route('addUser') }}" method="POST">
@csrf
<div class="mb-3">
<label class="form-label">Name</label>
<input type="text" value="{{ old('username') }}" class="form-control @error('username') is-invalid @enderror" name="username">
<span class="text-danger">
@error("username")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label class="form-label">Email</label>
<input type="email" value="{{ old('useremail') }}" class="form-control @error('useremail') is-invalid @enderror" name="useremail">
<span class="text-danger">
@error("useremail")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label class="form-label">Password</label>
<input type="password" value="{{ old('userpassword') }}" class="form-control @error('userpassword') is-invalid @enderror" name="userpassword">
<span class="text-danger">
@error("userpassword")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label class="form-label">Age</label>
<input type="text" value="{{ old('userage') }}" class="form-control @error('userage') is-invalid @enderror" name="userage">
<span class="text-danger">
@error("userage")
{{ $message }}
@enderror
</span>
</div>
<div class="mb-3">
<label class="form-label">City</label>
<select class="form-control" name="usercity">
<option value="delhi">Delhi</option>
<option value="mumbai">Mumbai</option>
<option value="goa">Goa</option>
<option value="pune">Pune</option>
</select>
<span class="text-danger">
@error("usercity")
{{ $message }}
@enderror
</span>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
</div>
</body>
</html>
Above File is resources\views\adduser.blade.php File
Below File is app\Rules\Uppercase.php File
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class Uppercase implements ValidationRule
{
/**
* Run the validation rule.
*
* @param \Closure(string, ?string=): \Illuminate\Translation\PotentiallyTranslatedString $fail
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
if(strtoupper($value) !== $value) {
$fail("The :attribute must be uppercase.");
}
}
}
Below File is app\Http\Controllers\UserController.php File
<?php
namespace App\Http\Controllers;
use App\Http\Requests\UserRequest;
use Illuminate\Http\Request;
use App\Rules\Uppercase;
use Illuminate\Support\Facades\Validator;
use Closure;
class UserController extends Controller
{
// There are two ways for applying Custom Validation Rule : Using Rule Object and Using Closure
// Applying Custom Validation Rule using "Rule Object" way in Laravel as shown below :
// public function addUser(Request $request)
// {
// $validate = $request->validate([
// "username" => ["required", new Uppercase],
// "useremail" => "required|email",
// "userpassword" => "required|alpha_num|min:5",
// "userage" => "required|numeric|between:18,100",
// "usercity" => "required"
// ]);
// return $request->all();
// }
// Applying Custom Validation Rule using "Closure" Method in Laravel as shown below :
// public function addUser(Request $request)
// {
// $validate = $request->validate([
// "username" => [
// "required",
// // Here below Field name(Here "username") will be store in "$attribute"
// function (string $attribute, mixed $value, Closure $fail) {
// if (strtoupper($value) !== $value) {
// $fail("The :attribute must be uppercase.");
// }
// }
// ],
// "useremail" => "required|email",
// "userpassword" => "required|alpha_num|min:5",
// "userage" => "required|numeric|between:18,100",
// "usercity" => "required"
// ]);
// // return $request->all();
// // dd($validate);
// echo $validate["username"];
// }
// public function addUser(UserRequest $request)
// {
// // return $request->all();
// // return $request->only(["username","usercity"]);
// return $request->except(["userpassword","usercity"]);
// }
public function addUser(Request $request)
{
// dd($request->all());
$request->validate([
"username" => "required",
"useremail" => "required|email",
"userpassword" => "required|alpha_num|min:5",
"userage" => "required|numeric|between:18,100",
"usercity" => "required"
], [
"username.required" => "Username field is required!",
"useremail.required" => "Useremail field is required!",
"useremail.email" => "Please Enter the correct Email Address!",
"userpassword.required" => "User Password field is required!",
"userpassword.alpha_num" => "User Password must be Alpha Numeric!",
"userpassword.min" => "User Password length should not less than 5",
"userage.required" => "User Age field is required!",
"userage.numeric" => "User Age must be Numeric!",
"userage.between" => "User Age must be between 18 to 100!",
"usercity.required" => "User City field is required!"
]);
return $request->all();
}
}
Below File is routes\web.php File
<?php
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Route::get("/form", function() {
return view("adduser");
});
Route::post("/add", [UserController::class, "addUser"])->name("addUser");
Below File is app\Http\Requests\UserRequest.php File
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
class UserRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
"username" => "required",
"useremail" => "required|email",
"userpassword" => "required|alpha_num|min:5",
"userage" => "required|numeric|between:18,100",
"usercity" => "required"
];
}
// Main Use of "FormRequest" Class is that Controller class will not be very Complex
// Because all Validation code(of Controller Class) will include in "FormRequest" Class File and we can easily understand Code
// And Controller class File will be Relax
// messages() method is inbuilt method of Laravel which will override the "messages()" method which is already made in "FormRequest" Class
// public function messages()
// {
// return [
// "username.required" => "Username field is required!",
// "useremail.required" => "Useremail field is required!",
// "useremail.email" => "Please Enter the correct Email Address!",
// "userpassword.required" => "User Password field is required!",
// "userpassword.alpha_num" => "User Password must be Alpha Numeric!",
// "userpassword.min" => "User Password length should not less than 5",
// "userage.required" => "User Age field is required!",
// "userage.numeric" => "User Age must be Numeric!",
// "userage.between" => "User Age must be between 18 to 100!",
// "usercity.required" => "User City field is required!"
// ];
// }
// attributes() method is inbuild method of Laravel
// Here below, only attributes names will only change, message will remain of Laravel default
public function attributes()
{
return [
"username" => "User Name",
"useremail" => "User Email",
"userpassword" => "User Password",
"userage" => "User Age",
"usercity" => "User City"
];
}
// prepareForValidation() method is inbuilt method of Laravel and this function returns nothing
protected function prepareForValidation(): void
{
// In prepareForValidation() method, we perform task which is performed before Validation
$this->merge([
// "username" => strtoupper($this->username),
"username" => Str::slug($this->username),
]);
}
// Be default, the value of $stopOnFirstFailure is False
// $stopOnFirstFailure is the protected Super Global Variable
// using $stopOnFirstFailure, we can show one error message of first Field at a time
// protected $stopOnFirstFailure = true;
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
Comments
Post a Comment