Правило confirmed
Правило confirmed проверяет, что значение проверяемого поля совпадает со значением другого поля,
название которого формируется добавлением суффикса _confirmation к имени проверяемого поля.
Например, для поля password будет выполняться поиск поля password_confirmation,
для поля email - email_confirmation.
Если поле с суффиксом _confirmation отсутствует в данных или его значение не совпадает с проверяемым полем,
валидация не проходит. Данное правило активно используется при создании форм регистрации,
смене пароля или при подтверждении email-адреса.
Синтаксис
Для использования правила достаточно передать строку confirmed в массив правил:
<?php
use Illuminate\Support\Facades\Validator;
$rules = [
'password' => 'required|confirmed|min:8',
];
?>
Альтернативный синтаксис через массив:
<?php
use Illuminate\Support\Facades\Validator;
$rules = [
'password' => ['required', 'confirmed', 'min:8'],
];
?>
Правило confirmed автоматически ожидает наличие поля с именем
{поле}_confirmation в массиве данных для валидации.
Пример
Создадим валидацию для регистрации пользователя с подтверждением пароля:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
class RegisterController extends Controller
{
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]);
return redirect()->route('home')->with('success', 'User registered successfully');
}
}
?>
Пример HTML-формы для отправки данных:
<form method="POST" action="/register">
@csrf
<input type="text" name="name" placeholder="Name">
<input type="email" name="email" placeholder="Email">
<input type="password" name="password" placeholder="Password">
<input type="password" name="password_confirmation" placeholder="Confirm Password">
<button type="submit">Register</button>
</form>
Результат выполнения кода при несовпадающих паролях:
"Validation failed: The password confirmation does not match."
Результат выполнения кода при успешной валидации:
"User registered successfully"
Пример
Использование правила confirmed в Form Request для изменения пароля:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdatePasswordRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'current_password' => 'required|current_password',
'new_password' => 'required|confirmed|min:8',
'new_password_confirmation' => 'required',
];
}
public function messages(): array
{
return [
'new_password.confirmed' => 'The new password confirmation does not match.',
'new_password.min' => 'The new password must be at least 8 characters.',
];
}
}
?>
Использование созданного Form Request в контроллере:
<?php
namespace App\Http\Controllers;
use App\Http\Requests\UpdatePasswordRequest;
use Illuminate\Support\Facades\Hash;
class ProfileController extends Controller
{
public function updatePassword(UpdatePasswordRequest $request)
{
$user = auth()->user();
$user->password = Hash::make($request->new_password);
$user->save();
return redirect()->back()->with('success', 'Password updated successfully');
}
}
?>
Пример Blade-шаблона для формы смены пароля:
<form method="POST" action="{{ route('password.update') }}">
@csrf
@method('PUT')
<input type="password" name="current_password" placeholder="Current Password">
<input type="password" name="new_password" placeholder="New Password">
<input type="password" name="new_password_confirmation" placeholder="Confirm New Password">
<button type="submit">Change Password</button>
@if ($errors->any())
<div>
@foreach ($errors->all() as $error)
<p>{{ $error }}</p>
@endforeach
</div>
@endif
</form>
Пример
Использование правила confirmed с кастомным именем поля для подтверждения email:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class EmailController extends Controller
{
public function confirmEmail(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email|confirmed',
'email_confirmation' => 'required|email',
]);
if ($validator->fails()) {
return response()->json([
'status' => 'error',
'errors' => $validator->errors()
], 422);
}
return response()->json([
'status' => 'success',
'message' => 'Email confirmed successfully'
]);
}
}
?>
Пример AJAX-запроса для отправки данных на сервер:
<script>
fetch('/confirm-email', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
body: JSON.stringify({
email: 'user@example.com',
email_confirmation: 'user@example.com'
})
})
.then(response => response.json())
.then(data => console.log(data));
</script>
Результат выполнения кода при успешном подтверждении:
"Email confirmed successfully"
Результат выполнения кода при несовпадающих email-адресах:
"The email confirmation does not match."
Смотрите также
-
правило
required,
которое делает поле обязательным для заполнения -
правило
same,
которое проверяет совпадение значения с другим полем -
правило
min,
которое устанавливает минимальное значение для поля -
правило
current_password,
которое проверяет текущий пароль пользователя