Если вы хотите создать свое собственное правило валидации, Laravel предоставляет возможность сделать это. Создайте правило с помощью следующей команды. Давайте создадим правило, которое будет проверять, что строка написана в верхнем регистре.
php artisan make:rule Uppercase
Этот класс будет создан в каталоге app/Rules. Он содержит метод pass и метод message. Метод passes содержит фактическое правило и принимает атрибут и его значение. Метод Message содержит сообщение об ошибке, если валидация не прошла.
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class Uppercase implements Rule { /** * Create a new rule instance. * * @return void */ public function __construct() { // } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { return $value == strtoupper($value); } /** * Get the validation error message. * * @return string */ public function message() { return 'The :attribute must be uppercase.'; } }
Давайте выполним валидацию с помощью этого правила. Я создал две строки. Одна из них в верхнем регистре, а другая нет. Давайте применим правило и проверим результат.
Route::get('/', function () { $pass_name = 'MS'; $fail_name = 'ms'; $data = [ 'pass_name' => $pass_name, 'fail_name' => $fail_name, ]; $validator = Validator::make($data, [ 'pass_name' => ['required', new Uppercase()], 'fail_name' => ['required', new Uppercase()], ]); if ($validator->fails()) { dd($validator->errors()->messages()); } else { dd('passed'); } });
Теперь при выполнении этого кода вы увидите, что валидатор даст сбой и вернет ошибку в поле fail_name.
array:1 [▼ "fail_name" => array:1 [▼0 => "The fail name must be uppercase." ] ]
Если класс вашего пользовательского правила валидации должен иметь доступ ко всем другим данным, проходящим валидацию, ваш класс правила может реализовать интерфейс Illuminate\Contracts\Validation\DataAwareRule. Этот интерфейс требует, чтобы ваш класс определил метод setData. Этот метод будет автоматически вызываться Laravel (до начала валидации) со всеми проверяемыми данными.
class Uppercase implements Rule, DataAwareRule { protected $data = []; /** * Create a new rule instance. * * @return void */ public function __construct() { // } /** * Set the data under validation. * * @param array $data * @return $this */ public function setData($data) { $this->data = $data; return $this; } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { return $value == strtoupper($value); } /** * Get the validation error message. * * @return string */ public function message() { return 'The :attribute must be uppercase.'; } }
Теперь свойство data класса Uppercase содержит все проверяемые данные, которые в нашем случае являются массивом $data, содержащим оба имени.
Или, если ваше правило проверки требует доступа к экземпляру валидатора, выполняющему проверку, вы можете реализовать интерфейс ValidatorAwareRule.
class Uppercase implements Rule, ValidatorAwareRule { protected $validator = []; /** * Create a new rule instance. * * @return void */ public function __construct() { // } /** * Set the current validator. * * @param \Illuminate\Validation\Validator $validator * @return $this */ public function setValidator($validator) { $this->validator = $validator; return $this; } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { return $value == strtoupper($value); } /** * Get the validation error message. * * @return string */ public function message() { return 'The :attribute must be uppercase.'; } }
Теперь ваш класс правила имеет доступ к экземпляру валидатора.
Если функциональность пользовательского правила нужна только один раз в вашем приложении, вы можете использовать закрытие вместо объекта правила. Закрытие получает имя атрибута, значение атрибута и обратный вызов $fail, который должен быть вызван в случае неудачной валидации. Приведенная выше проверка может быть выполнена следующим образом.
use Illuminate\Support\Facades\Validator; $validator = Validator::make($data, [ 'pass_name' => [ 'required', function ($attribute, $value, $fail) { if ($value !== strtoupper($value)) { $fail('The '.$attribute.' must be uppercase.'); } }, ], 'fail_name' => [ 'required', function ($attribute, $value, $fail) { if ($value !== strtoupper($value)) { $fail('The '.$attribute.' must be uppercase.'); } }, ], ]);
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.