Изучение пользовательского правила «Exists» в Laravel: подробное руководство с примерами кода

В Laravel правило «существует» обычно используется для проверки существования значения в данном столбце таблицы базы данных. Хотя Laravel предоставляет это правило по умолчанию для базовых сценариев, существуют ситуации, когда вам может потребоваться создать собственное правило «exists» для обработки сложных требований проверки. В этой статье мы рассмотрим различные методы создания собственного правила «exists» в Laravel, сопровождаемые примерами кода.

Метод 1: расширение класса Validator
Первый метод включает расширение класса Validator и добавление специального правила проверки для проверки «существует». Вот пример того, как этого можно добиться:

// Create a new file: app/Rules/CustomExistsRule.php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\DB;
class CustomExistsRule implements Rule
{
    protected $table;
    protected $column;
    public function __construct($table, $column)
    {
        $this->table = $table;
        $this->column = $column;
    }
    public function passes($attribute, $value)
    {
        return DB::table($this->table)
            ->where($this->column, $value)
            ->exists();
    }
    public function message()
    {
        return 'The selected :attribute is invalid.';
    }
}

Чтобы использовать это специальное правило при проверке, вы можете сделать следующее:

use App\Rules\CustomExistsRule;
$request->validate([
    'email' => ['required', new CustomExistsRule('users', 'email')],
]);

Метод 2: использование правила на основе замыкания
Другой подход заключается в использовании правила на основе замыкания для создания пользовательской проверки «существования». Вот пример:

use Illuminate\Validation\Rule;
$rule = Rule::exists('users', 'email')->where(function ($query) {
    $query->where('status', '=', 'active');
});
$request->validate([
    'email' => ['required', $rule],
]);

Метод 3: реализация интерфейса правил
Вы также можете реализовать интерфейс правил напрямую, чтобы создать собственное «существующее» правило. Вот пример:

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\DB;
class CustomExistsRule implements Rule
{
    public function passes($attribute, $value)
    {
        return DB::table('users')
            ->where('email', $value)
            ->exists();
    }
    public function message()
    {
        return 'The selected :attribute is invalid.';
    }
}
$request->validate([
    'email' => ['required', new CustomExistsRule],
]);

Создание пользовательских правил «существования» в Laravel позволяет легко справляться со сложными сценариями проверки. В этой статье мы рассмотрели три различных метода достижения этой цели. Вы можете выбрать метод, который лучше всего соответствует вашим требованиям, и реализовать его в своих приложениях Laravel.

Помните, что пользовательские правила проверки обеспечивают гибкость и возможность повторного использования, гарантируя, что проверка вашего приложения останется надежной и удобной в обслуживании.