Laravel Validation And Repopulating Forms (form values preserve in view ), GET and Post requests
Laravel Validation is a feature of the Laravel framework that provides a convenient way to validate incoming data from HTTP requests, form submissions, or any other data source. Validation is an important part of any web application, as it helps ensure that user input is correct and meets certain requirements before it is processed or stored. Here is an example
1. Make Route ie
Route::post('/insertdata', [insertdata::class, 'insertdata'])->name("insertdata");
In Controller
public function insertdata(Request $request)
{
$validated = $request->validate([
'title' => 'required',
]);
//////////////// OR
$validated = $request->validate([
'email' => 'required',
], [
'email.required' => 'Please provide your email address.',
]);
}
In view
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" action="{{ route('insertdata') }}">
<input type="text" name="title">
<input type="submit" value="submit">
</form>
It will display error if we leave empty title
ERROR DIRECTIVE:
In Laravel, the @error directive is a Blade directive that is used to display validation error messages in a view. The @error directive is used in combination with the ->withErrors() method of the Validator class to pass validation error messages to the view.
Now if we want to get class inside input we use error blade directive. If we leave title is empty class is-invalid is added.
<form method="post" action="{{ route('insertdata') }}">
<input type="text" name="title" class="@error('title') is-invalid @enderror">
<input type="submit" value="submit">
</form>
We can also set div below input field to show better error text
<form method="post" action="{{ route('insertdata') }}">
<input type="text" name="title" class="@error('title') is-invalid @enderror">
@error('review_title')
<div class="alert alert-danger">{{ $errors->first('review_title') }}</div>
@enderror
<input type="submit" value="submit">
</form>
Determining If Messages Exist For A Field
if ($errors->has('email')) {
//
}
Loop errors
foreach ($errors->all() as $message) {
//
}
Repopulating Forms
framework flash all of the request's input to the session if redirect occure. To retrieve use old method on an instance of Illuminate\Http\Request.
$title = $request->old('title');
<input type="text" name="title" value="{{ old('title') }}">
Nullable validation rule:
'publish_at' => 'nullable|date',
it may be either null or a valid date representation. If the nullable modifier is not added to the rule definition, the validator would consider null an invalid date.
CUSTOM ERROR MESSAGES:
add below code in your controller
use Illuminate\Support\Facades\Validator;
$rules = [
'name' => 'required|max:255',
'email' => 'required|email',
];
$messages = [
'required' => 'The :attribute field is required.',
'email.email' => 'Please enter a valid email address',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
OR
$custom_message = [
'first_name.required' => 'Please enter a valid Name',
];
$validator = Validator::make($request->all(), $rules, $messages);
$validation = Validator::make($input, [
'first_name' => ['required', 'string', 'max:255'],
], $custom_message)->validate();
All rules list here
Accepted,Accepted If,Active URL,After (Date),After Or Equal (Date),Alpha,Alpha Dash
https://laravel.com/docs/9.x/validation#available-validation-rules
_________________________
Controller.php
session()->flashInput($request->input());
return view('index.php');
View.php
{{ old('name') }}
{{Request::old('name')}}
How to echo image path:
{{Storage::url($customer->image)}}
GET REQUEST:
View
<form action="/search" method="GET">
<input type="email" name="email" />
<button type="submit">Submit</button>
</form>
Controller
use Illuminate\Http\Request;
public function search(Request $request)
{
$email = $request->input('email');
return view('search-results', compact('name', 'email'));
}
Route:
Route::get('/search', 'YourController@search');
GET Query parameter inside view
app('request')->input('email')
POST REQUEST:
View
<form action="/submit" method="POST">
@csrf <!-- Add this CSRF token for security -->
<input type="email" name="email" />
<button type="submit">Submit</button>
</form>
Controller:
use Illuminate\Http\Request;
public function submit(Request $request)
{
$email = $request->input('email');
return redirect('/success');
}
Route:
Route::post('/submit', 'YourController@submit');