Сегодня мы рассмотрим: Настоящие ценители музыки знают, что для качественного...
Последнее обновление: 08.04.2016
Итак, в нашем распоряжении имеются различные элементы, которые мы можем использовать на форме. Мы можем вводить в них различные значения. Однако нередко пользователи вводят не совсем корректные значения: например, ожидается ввод чисел, а пользователь вводит буквы и т.д. И для предупреждения и проверки некорректного ввода в HTML5 существует механизм валидации.
Преимущество использования валидации в HTML5 заключается в том, что пользователь после некорректного ввода может сразу получить сообщение об ошибке и внести соответствующие изменения в введенные данные.
Для создания валидации у элементов форм HTML5 используется ряд атрибутов:
required : требует обязательного ввода значения. Для элементов textarea, select, input (с типом text, password, checkbox, radio, file, datetime-local, date, month, time, week, number, email, url, search, tel)
min и max : минимально и максимально допустимые значения. Для элемента input с типом datetime-local, date, month, time, week, number, range
pattern : задает шаблон, которому должны соответствовать вводимые данные. Для элемента input с типом text, password, email, url, search, tel
Атрибут required требует обязательного наличия значения:
Валидация в HTML5
Логин:
Пароль:
Если мы не введем в эти поля никаких данных, оставив их пустыми, и нажмем на кнопку отправки, то браузер высветит нам сообщения об ошибке, а данные не будут отправлены на сервер:
В зависимости от браузера визуализация сообщения может несколько отличаться. Также границы некорректного поля ввода могут окрашиваться в красный цвет. Например, поведение при отправке пустых сообщений в Firefox:
Атрибуты max и minДля ограничения диапазона вводимых значений применяются атрибуты max и min:
Валидация в HTML5
Возраст:
Атрибут pattern
Атрибут pattern задает шаблон, которому должны соответствовать данные. Для определения шаблона используется язык так называемых . Рассмотрим самые простейшие примеры:
Валидация в HTML5
Телефон:
Здесь для ввода номера телефона используется регулярное выражение \+\d-\d{3}-\d{3}-\d{4} . Оно означает, что первым элементом в номере должен идти знак плюс +. Выражение \d представляет любую цифру от 0 до 9. Выражение \d{3} означает три подряд идущих цифры, а \d{4} - четыре цифры подряд. То есть это выражение будет соответствовать номеру телефона в формате "+1-234-567-8901".
Если мы введем данные, которые не соответствуют этому шаблону, и нажмем на отправку, то браузер отобразит ошибку:
Отключение валидацииНе всегда валидация является желаемой, иногда требуется ее отключить. И в этом случае мы можем использовать либо у элемента формы атрибут novalidate , либо у кнопки отправки атрибут formnovalidate :
Валидация в HTML5
Телефон:
Добрый день, уважаемый читатель. В этой статье я бы хотел обратиться к теме проверки содержимого форм на стороне клиента. На заре становления языков, работающих на клиенте, эта задача была основной. Со временем эти языки обросли новыми возможностями (манипуляция DOM, управление стилями и пр.), но задача проверки форм не исчезла. Правда с появлением HTML5 стало возможным указывать такой тип поля формы, как email, и браузер сам возьмет на себя его проверку. Такая возможность на данный момент реализована в Opera, так что расчитывать на нее пока особо не приходится. Поэтому я бы и хотел рассмотреть этот вопрос основательно. В большинстве случаев валидация проводится так: каждому полю раздаётся id, и затем при submit"е вытаскиваем их, попутно проверяя содержимое. И всем хорош данный подход, кроме отсутствия в нем системности. Поэтому хочу предложить вашему вниманию свое решение данной проблемы.Итак понеслася! В качестве примера приведена несложная форма, содержащая поля для имени, почтового ящика и пола.
HTML-код файла:
input { border: 1px solid #D4E2F7; } input { margin: 3px 0px 3px 15px; } ....
male
female
Весь остальной код будет помещаться в теге .
Сначала создаем функцию, которая будет задавать все необходимые поля, предварительно снабжая их свойствами. Названия полей перечислены в массиве members.
Function createField() { var members = new Array("required", "regexp"); for(var i = 0; i < arguments.length; i++) { this] = arguments[i]; } } // absolute regexp createField.prototype.regexp = /^{1,}$/ig; createField.prototype.valid = false; createField.prototype.required = true; createField.prototype.nullify = function() { this.valid = false; };
Далее в прототипе укажем значения по умолчанию полей.
regexp
- регулярка, которой должно удовлетворять значение соответствующего поля.
valid
- результат проверки значения поля регулярным выражением regexp
.
required
- индикатор того: требуется ли данное поле (можно ли оставить поле незаполненным).
nullify()
- метод, возвращающий поле valid
в исходное состояние.
Var single = new Array();
single["name"] = new createField();
single["email"] = new createField(true, /^+@+\.{2,4}$/);
single["sex"] = new createField(true, /male$/ig);
Создаем как бы праобраз нашей формы. В ней будет 3 поля с именами name, email и sex, каждое из которых не может остаться незаполненным. Притом значения 2х последних полей должны удовлетворять указанным во втором параметре регулярном выражении.
var Singleton = {
fields: single,
regForm: false,
nullify_values: function() {
for(i in this.fields) {
this.fields[i].nullify();
}
},
...
};
В данном участке кода мы объявляем объект Singleton. Назначение поля fields
понятно. Поле regForm
- объект, содержащий форму. Через него мы и будем получать доступ к полям формы и их значениям.
Метод nullify_values()
возвращает значение поля valid
у «подобъектов» (т.к. fields
это массив объектов) в исходное состояние.
И напоследок самое интересное. Метод submit()
, который и заключает в себе основной функционал.
submit: function() {
if(this.regForm) {
// set property valid to false for every form field
this.nullify_values();
var i = null;
// walks through the form fields, pick and if required check their values
for(i = 0; i < this.regForm.elements.length; i++) {
// current field
var oField = this.regForm.elements[i];
switch (oField.type) {
case "button":
case "submit":
case "reset":
break;
case "checkbox":
case "radio":
if(!oField.checked) {
break;
}
default:
// javascript trim function analogue
oField.value = oField.value.replace(/^\s*/, "").replace(/\s*$/, "");
if(!oField.value) {
oField.value = "";
}
// if this field is out of interest
if(!this.fields.required) {
this.fields.valid = true;
this.regForm[i].style.border="";
}
// if this field is required
else {
var match = this.fields.regexp.test(oField.value);
// ... and fits regular expression
if(match) {
this.fields.valid = true;
this.regForm[i].style.border="";
}
this.fields.regexp.test(oField.value);
}
}
}
// now all we need is to check if the whole form is valid
// we perform it by comparing number of form fields and number of valid fields
// they should be equal
var validForm = 0;
var fieldsLength = 0;
for(i in this.fields) {
fieldsLength++;
if(this.fields[i].valid) {
validForm++;
}
else {
this.regForm[i].style.border="1px solid #FF0000";
break;
}
}
if(validForm == fieldsLength) {
this.regForm.submit();
}
else {
this.nullify_values();
return false;
}
}
}
Сначала обнуляем значения valid. Затем проходимся по полям формы. Если поле не несет особой смысловой нагрузки (типа reset) или не является помеченным галочкой - пропускаем его. Удаляем ведущие и замыкающие пробелы. И если поле является необходимым - проверяем его содержимое с помощью регулярного выражения. Если нет - идем дальше. Теперь осталось посчитать общее количество полей и количество валидных полей. И если они совпадают, то форму можно отправлять.
single = null;
window.onload = function() {
var regForm = document.forms;
Singleton.regForm = regForm;
Singleton.regForm.onsubmit = function() {
return Singleton.submit();
};
};
И в самом конце мы «занулляем» объект single
, чтобы невзначай не изменить значений Singleton.fields
, выхватываем форму и даем ей обработчик события submit
.
2 . В случае большого количества полей, не требующих валидации, не получится ли так, что создается много объектов, свойства которых по большому счету не нужны? Нет. И вот почему. Когда мы достаем поле объекта интерпретатор JS сначала смотрит в самом объекте и если не находит - в прототипе. Таким образом значения по умолчанию хранятся в прототипе в единственном экземпляре, что не есть накладно.
3 . Почему когда содержимое поля удовлетворяет регулярному выражению я делаю проверку еще раз? На это вразумительного ответа у меня нет. Опытным путем я заметил, что когда применяется функция RegExp.test() , то сначала она возвращает результат ожидаемый, а потом прямо противоположный. Попробуйте закомментировать эту строку и сами увидите, как поведение станет непредсказуемым. В обычном случае такого не наблюдается.
Цимес Данный скрипт обладает большой гибкостью в том смысле, что при переносе придется лишь изменить имена полей (ключи массива single ) и регулярные выражения для их проверки.Посмотреть работу скрипта можно
Laravel поставляется с простой, удобной системой валидации (проверки входных данных на соответствие правилам) и получения сообщений об ошибках - классом Validation .
Простейший пример валидации $validator = Validator::make(array("name" => "Дейл"), array("name" => "required|min:5"));Первый параметр, передаваемый методу make - данные для проверки. Второй параметр - правила, которые к ним должны быть применены.
Использование массивов для указания правилНесколько правил могут быть разделены либо прямой чертой (|), либо быть отдельными элементами массива.
$validator = Validator::make(array("name" => "Дейл"), array("name" => array("required", "min:5")));
Проверка нескольких полей $validator = Validator::make(array("name" => "Дейл", "password" => "плохойпароль", "email" => "[email protected]"), array("name" => "required", "password" => "required|min:8", "email" => "required|email|unique"));Как только был создан экземпляр Validator , метод fails (или passes) может быть использован для проведения проверки.
If ($validator->fails()) { // Переданные данные не прошли проверку }
Если Validator нашёл ошибки, вы можете получить его сообщения таким образом:
$messages = $validator->messages();
Вы также можете получить массив правил, данные которые не прошли проверку, без самих сообщений:
$failed = $validator->failed();
Проверка файловКласс Validator содержит несколько изначальных правил для проверки файлов, такие как size , mimes и другие. Для выполнения проверки над файлами просто передайте эти файлы вместе с другими данными.
Хук после валидацииLaravel после завершения валидации может запустить вашу функцию-замыкание, в которой вы можете, например, проверить что-то особенное или добавить какое-то своё сообщение об ошибке. Для этого служит метод after() :
$validator = Validator::make(...); $validator->after(function($validator) { if ($this->somethingElseIsInvalid()) { $validator->errors()->add("field", "Something is wrong with this field!"); } }); if ($validator->fails()) { // }
Вы можете добавить несколько after , если это нужно.
Валидация в контроллерахПисать полный код валидации каждый раз, когда нужно провалидировать данные - это неудобно. Поэтому Laravel предоставляет несколько решений для упрощения этой процедуры.
Базовый контроллер App\Http\Controllers\Controller включает в себя трейт ValidatesRequests , который уже содержит методы для валидации:
/** * Сохранить пост в блоге. * * @param Request $request * @return Response */ public function store(Request $request) { $this->validate($request, [ "title" => "required|unique|max:255", "body" => "required", ]); // }
Если валидация проходит, код продолжает выполняться. Если нет - бросается исключение Illuminate\Contracts\Validation\ValidationException . Если вы не поймаете это исключение, его поймает фреймворк, заполнит flash-переменные сообщениями об ошибках валидации и средиректит пользователя на предыдущую страницу с формой - сам!
В случае AJAX-запроса редиректа не происходит, фреймворк отдает ответ с HTTP-кодом 422 и JSON с ошибками валидации.
Код, приведенный выше, аналогичен вот этому::
/** * Сохранить пост в блоге. * * @param Request $request * @return Response */ public function store(Request $request) { $v = Validator::make($request->all(), [ "title" => "required|unique|max:255", "body" => "required", ]); if ($v->fails()) { return redirect()->back()->withErrors($v->errors()); } // }
Изменения формата ошибокЕсли вы хотите кастомизировать сообщения об ошибках валидации, которые сохраняются во флэш-переменных сессии при редиректе, перекройте метод formatValidationErrors в вашем контроллере:
/** * {@inheritdoc} */ protected function formatValidationErrors(\Illuminate\Validation\Validator $validator) { return $validator->errors()->all(); } Валидация запросовДля реализации более сложных сценариев валидации вам могут быть удобны так называемые Form Requests. Это специальные классы HTTP-запроса, содержащие в себе логику валидации. Они обрабатывают запрос до того, как он поступит в контроллер.
Чтобы создать класс запроса, используйте artisan-команду make:request:
Php artisan make:request StoreBlogPostRequest
Класс будет создан в папке app/Http/Requests . Добавьте необходимые правила валидации в его метод rules:
/** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ "title" => "required|unique|max:255", "body" => "required", ]; }
Для того, чтобы фреймворк перехватил запрос перед контроллером, добавьте этот класс в аргументы необходимого метода контроллера:
При грамотном использовании валидации запросов вы можете быть уверены, что в ваших контроллерах всегда находятся только отвалидированные входные данные!
В случае неудачной валидации фреймворк заполняет флэш-переменные ошибками валидации и возврашает редирект на предыдущую страницу. В случае AJAX-запроса отдается ответ с кодом 422 и JSON с ошибками валидации.
Контроль доступаКлассы Form Request также содержат метод authorize . В этом методе вы можете проверять, разрешено ли пользователю совершать это действие, обновлять данный ресурс. Например, если пользователь пытается отредактировать комментарий к посту, является ли он его автором?
/** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { $commentId = $this->route("comment"); return Comment::where("id", $commentId) ->where("user_id", Auth::id())->exists(); }
Обратите внимание на вызов метода route() выше. Этод метод дает вам доступ к параметрам в урле (в данном случае это {comment}), определенным в роуте:
Route::post("comment/{comment}");
Если метод authorize возвращает false, фреймворк формирует ответ с HTTP-кодом 403 и сразу же отсылает его. Метод контроллера не выполняется.
/** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; }
Изменения формата ошибок во флэш-переменныхЕсли вы хотите кастомизировать сообщения об ошибках валидации, которые сохраняются во флэш-переменных сессии при редиректе, переопределите метод formatValidationErrors в базовом классе запросов (App\Http\Requests\Request):
/** * {@inheritdoc} */ protected function formatValidationErrors(\Illuminate\Validation\Validator $validator) { return $validator->errors()->all(); } Работа с сообщениями об ошибкахПосле вызова метода messages объекта Validator вы получите объект MessageBag , который имеет набор полезных методов для доступа к сообщениям об ошибках.
Получение первого сообщения для поля echo $messages->first("email"); Получение всех сообщений для одного поля foreach ($messages->get("email") as $message) { // } Получение всех сообщений для всех полей foreach ($messages->all() as $message) { // } Проверка на наличие сообщения для поля if ($messages->has("email")) { // } Получение ошибки в заданном формате echo $messages->first("email", "");Примечание: по умолчанию сообщения форматируются в вид, который подходит для Twitter Bootstrap.
Получение всех сообщений в заданном формате foreach ($messages->all("Как только вы провели проверку, вам понадобится простой способ, чтобы передать ошибки в шаблон. Laravel позволяет удобно сделать это. Например, у нас есть такие роуты:
Route::get("register", function() { return View::make("user.register"); }); Route::post("register", function() { $rules = array(...); $validator = Validator::make(Input::all(), $rules); if ($validator->fails()) { return redirect("register")->withErrors($validator); } });
Заметьте, что когда проверки не пройдены, мы передаём объект Validator объекту переадресации Redirect с помощью метода withErrors . Этот метод сохранит сообщения об ошибках в одноразовых flash-переменных сессии, таким образом делая их доступными для следующего запроса.
Однако, заметьте, мы не передаем в View::make("user.register"); переменные $errors в шаблон. Laravel сам проверяет данные сессии на наличие переменных и автоматически передает их шаблону, если они доступны. Таким образом, важно помнить, что переменная $errors будет доступна для всех ваших шаблонов всегда, при любом запросе. . Это позволяет вам считать, что переменная $errors всегда определена и может безопасно использоваться. Переменная $errors - экземпляр класса MessageBag .
Таким образом, после переадресации вы можете прибегнуть к автоматически установленной в шаблоне переменной $errors:
Именованные MessageBag
Если у вас есть несколько форм на странице, то вы можете выбрать имя объекта MessageBag, в котором будут возвращаться тексты ошибок, чтобы вы могли их корректно отобразить для нужной формы.
Return redirect("register")->withErrors($validator, "login");
Получить текст ошибки из MessageBag с именем login:
Правила проверки
Ниже список всех доступных правил и их функции:
acceptedПоле должно быть в значении yes , on или 1 . Это полезно для проверки принятия правил и лицензий.
active_urlПоле должно быть корректным URL, доступным через функцию checkdnsrr .
after:dateПоле должно быть датой, более поздней, чем date
alphaПоле должно содержать только алфавитные символы.
alpha_dashПоле должно содержать только алфавитные символы, цифры, знаки подчёркивания (_) и дефисы (-).
alpha_numПоле должно содержать только алфавитные символы и цифры.
arrayПоле должно быть массивом.
before:dateПоле должно быть датой, более ранней, чем date . Строки приводятся к датам функцией strtotime .
between:min ,maxПоле должно иметь размер в диапазоне от min до max . Строки, числа и файлы трактуются аналогично правилу size .
booleanПоле должно быть логическим (булевым). Разрешенные значения: true , false , 1 , 0 , "1" и "0" .
confirmedЗначение поля должно соответствовать значению поля с этим именем, плюс foo_confirmation . Например, если проверяется поле password , то на вход должно быть передано совпадающее по значению поле password_confirmation .
dateПоле должно быть правильной датой в соответствии с функцией strtotime .
date_format:formatПоле должно подходить под формат даты format в соответствии с функцией date_parse_from_format .
different:fieldЗначение проверяемого поля должно отличаться от значения поля field .
emailПоле должно быть корректным адресом e-mail.
exists:table ,columnПоле должно существовать в заданной таблице базе данных.
Простое использование:
"state" => "exists:states"
Указание имени поля в таблице:
"state" => "exists:states,abbreviation"
Вы также можете указать больше условий, которые будут добавлены к запросу "WHERE":
"email" => "exists:staff,email,account_id,1"
imageЗагруженный файл должен быть изображением в формате jpeg, png, bmp, gif или svg.
in:foo ,bar ,...Значение поля должно быть одним из перечисленных (foo , bar и т.д.).
integerПоле должно иметь корректное целочисленное значение.
ipПоле должно быть корректным IP-адресом.
max:valueЗначение поля должно быть меньше или равно value
mimes:foo ,bar ,...MIME-тип загруженного файла должен быть одним из перечисленных.
Простое использование:
"photo" => "mimes:jpeg,bmp,png"
min:valueЗначение поля должно быть более value . Строки, числа и файлы трактуются аналогично правилу .
not_in:foo ,bar ,...Значение поля не должно быть одним из перечисленных (foo , bar и т.д.).
numericПоле должно иметь корректное числовое или дробное значение.
regex:patternПоле должно соответствовать заданному регулярному выражению.
Внимание: при использовании этого правила может быть нужно перечислять другие правила в виде элементов массива, особенно если выражение содержит символ вертикальной черты (|).
requiredПроверяемое поле должно присутствовать и иметь непустое значение.
required_if:field ,value ,...Проверяемое поле должно присутствовать и иметь непустое значение, если другое поле field присутствует и имеет любое из значений value .
required_with:foo ,bar ,...Присутствует и имеет непустое значение хотя бы одно из перечисленных полей (foo , bar и т.д.).
required_with_all:foo ,bar ,...Проверяемое поле должно присутствовать и иметь непустое значение, но только если присутствуют и имеют непустое значение все перечисленные поля (foo , bar и т.д.).
required_without:foo ,bar ,...Проверяемое поле должно присутствовать и иметь непустое значение, но только если не присутствует или имеет пустое значение хотя бы одно из перечисленных полей (foo , bar и т.д.).
required_without_all:foo ,bar ,...Проверяемое поле должно присутствовать и иметь непустое значение, но только если не присутствуют или имеют пустые значения все перечисленные поля (foo , bar и т.д.).
same:fieldПоле должно иметь то же значение, что и поле field .
size:valueПоле должно иметь совпадающий с value размер. Для строк это обозначает длину, для чисел - число, для файлов - размер в килобайтах.
timezoneПоле должно содержать идентификатор часового пояса (таймзоны), один из перечисленных в php-функции timezone_identifiers_list
unique:table ,column ,except ,idColumnЗначение поля должно быть уникальным в заданной таблице базы данных. Если column не указано, то будет использовано имя поля.
Простое использование "email" => "unique:users" Указание имени поля в таблице "email" => "unique:users,email_address" Игнорирование определённого ID "email" => "unique:users,email_address,10" Добавление дополнительных условийВы также можете указать больше условий, которые будут добавлены к запросу "WHERE"":
"email" => "unique:users,email_address,NULL,id,account_id,1"
В правиле выше только строки с account_id равном 1 будут включены в проверку.
urlПоле должно быть корректным URL.
Примечание: используется PHP-функция filter_var
Условные правилаИногда вам нужно валидировать некое поле только тогда, когда оно присутствует во входных данных. Для этого добавьте правило sometimes:
$v = Validator::make($data, array("email" => "sometimes|required|email",));
В примере выше для поля email будет запущена валидация только когда $data["email"] существует.
Сложные условные правилаИногда вам нужно, чтобы поле имело какое-либо значение только если другое поле имеет значеие, скажем, больше 100. Или вы можете требовать наличия двух полей, только когда также указано третье. Это легко достигается условными правилами. Сперва создайте объект Validator с набором статичных правил, которые никогда не изменяются:
$v = Validator::make($data, array("email" => "required|email", "games" => "required|numeric",));
Теперь предположим, что ваше приложение написано для коллекционеров игр. Если регистрируется коллекционер с более, чем 100 играми, то мы хотим их спросить, зачем им такое количество. Например, у них может быть магазин или может им просто нравится их собирать. Итак, для добавления такого условного правила мы используем метод Validator .
$v->sometimes("reason", "required|max:500", function($input) { return $input->games >= 100; });
Первый параметр этого метода - имя поля, которое мы проверяем. Второй параметр - правило, которое мы хотим добавить, если переданная функция-замыкание (третий параметр) вернёт true . Этот метод позволяет легко создавать сложные правила проверки ввода. Вы можете даже добавлять одни и те же условные правила для нескольких полей одновременно:
$v->sometimes(array("reason", "cost"), "required", function($input) { return $input->games >= 100; });
Примечание: Параметр $input , передаваемый замыканию - объект Illuminate\Support\Fluent и может использоваться для чтения проверяемого ввода и файлов.
Собственные сообщения об ошибкахВы можете передать собственные сообщения об ошибках вместо используемых по умолчанию. Есть несколько способов это сделать.
Передача своих сообщений в Validator $messages = array("required" => "Поле:attribute должно быть заполнено.",); $validator = Validator::make($input, $rules, $messages);Примечание: строка:attribute будет заменена на имя проверяемого поля. Вы также можете использовать и другие строки-переменные.
Использование других переменных-строк $messages = array("same" => "Значения:attribute и:other должны совпадать.", "size" => "Поле:attribute должно быть равно exactly:size.", "between" => "Значение:attribute должно быть от:min и до:max.", "in" => "Поле:attribute должно иметь одно из следующих значений: :values",); Указание собственного сообщения для отдельного поляИногда вам может потребоваться указать своё сообщение для отдельного поля.
$messages = array("email.required" => "Нам нужно знать ваш e-mail адрес!",);
Указание собственных сообщений в файле локализацииТакже можно определять сообщения валидации в файле локализации вместо того, чтобы передавать их в Validator напрямую. Для этого добавьте сообщения в массив custom файла локализации app/lang/xx/validation.php .
"custom" => array("email" => array("required" => "Нам нужно знать ваш e-mail адрес!",),),
Собственные правила проверки Регистрация собственного правила валидацииLaravel изначально содержит множество полезных правил, однако вам может понадобиться создать собственные. Одним из способов зарегистрировать произвольное правило - через метод Validator::extend .
Validator::extend("foo", function($attribute, $value, $parameters) { return $value == "foo"; });
Примечание: имя правила должно быть в формате_с_подчёркиваниями.
Переданная функция-замыкание получает три параметра: имя проверяемого поля $attribute , значение поля $value и массив параметров $parameters , переданных правилу.
Вместо функции в метод extend можно передать ссылку на метод класса:
Validator::extend("foo", "FooValidator@validate");
Обратите внимание, что вам также понадобится определить сообщение об ошибке для нового правила. Вы можете сделать это либо передавая его в виде массива строк в Validator , либо вписав в файл локализации.
Расширение класса ValidatorВместо использования функций-замыканий для расширения набора доступных правил вы можете расширить сам класс Validator . Для этого создайте класс, который наследует Illuminate\Validation\Validator . Вы можете добавить новые методы проверок, начав их имя с validate .