Класс Rule
Класс Rule в Laravel - это фасад, который предоставляет набор статических методов для создания правил валидации. Он особенно полезен, когда стандартные правила валидации не подходят из-за необходимости добавить дополнительные условия, например, проверку уникальности значения с игнорированием конкретной записи. Класс Rule позволяет создавать цепочки методов, делая код валидации более читаемым и гибким.
Основное преимущество класса в том, что он предоставляет объектно-ориентированный интерфейс для определения правил. Это особенно актуально при создании сложных правил, таких как unique и exists, где требуется указать таблицу, столбец и, возможно, игнорируемый идентификатор.
Синтаксис
<?php
use Illuminate\Validation\Rule;
Rule::unique('users', 'email')->ignore($id);
?>
Пример использования Rule::unique
Давайте создадим правило для проверки уникальности email-адреса при обновлении профиля пользователя. Нам необходимо убедиться, что email уникален, но не учитывать текущего пользователя.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Models\User;
class UserController extends Controller
{
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
$request->validate([
'email' => [
'required',
'email',
Rule::unique('users', 'email')->ignore($user->id),
],
'name' => 'required|string|max:255',
]);
$user->update($request->all());
echo "User updated successfully";
}
}
?>
Результат выполнения кода при успешном обновлении:
"User updated successfully"
Пример использования Rule::exists
Теперь давайте проверим, что переданный category_id существует в таблице categories. Для этого используем метод exists.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class ArticleController extends Controller
{
public function store(Request $request)
{
$request->validate([
'title' => 'required|string|max:200',
'category_id' => [
'required',
'integer',
Rule::exists('categories', 'id'),
],
]);
// Saving article logic...
echo "Article created";
}
}
?>
Результат выполнения кода при успешном создании статьи:
"Article created"
Пример использования Rule::in
Метод in позволяет ограничить допустимые значения для поля. Давайте проверим, что значение поля status является одним из допустимых: draft, published или archived.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class PostController extends Controller
{
public function store(Request $request)
{
$request->validate([
'title' => 'required|string',
'status' => [
'required',
Rule::in(['draft', 'published', 'archived']),
],
]);
// Saving post logic...
echo "Post saved";
}
}
?>
Результат выполнения кода при успешном сохранении:
"Post saved"
Пример использования Rule::when
Метод when позволяет добавлять правила валидации условно, в зависимости от значения другого поля. Например, если поле has_discount равно 1, то поле discount_value должно быть числом и не превышать 100.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class ProductController extends Controller
{
public function update(Request $request)
{
$request->validate([
'name' => 'required|string',
'has_discount' => 'boolean',
'discount_value' => Rule::when(
$request->has_discount == 1,
['required', 'integer', 'max:100'],
['nullable']
),
]);
echo "Product updated";
}
}
?>
Результат выполнения кода при успешном обновлении:
"Product updated"
Смотрите также
-
класс
FormRequest,
который предоставляет удобный способ для валидации запросов -
метод
validate,
который выполняет валидацию данных -
метод
fails,
который проверяет, провалилась ли валидация -
класс
Validator,
который представляет объект валидатора