Может войдёшь?
Черновики Написать статью Профиль

Проверка ввода

перевод документация 4.x

  1. 1. Основы использования
  2. 2. Работа с сообщениями об ошибках
  3. 3. Ошибки и шаблоны
    1. 3.1. Именованные наборы ошибок
  4. 4. Доступные правила проверки
    1. 4.1. accepted
    2. 4.2. active_url
    3. 4.3. after:date
    4. 4.4. alpha
    5. 4.5. alpha_dash
    6. 4.6. alpha_num
    7. 4.7. array
    8. 4.8. before:date
    9. 4.9. between:min,max
    10. 4.10. boolean
    11. 4.11. confirmed
    12. 4.12. date
    13. 4.13. date_format:format
    14. 4.14. different:field
    15. 4.15. digits:value
    16. 4.16. digits_between:min,max
    17. 4.17. email
    18. 4.18. exists:table,column
    19. 4.19. image
    20. 4.20. in:foo,bar,…
    21. 4.21. integer
    22. 4.22. ip
    23. 4.23. max:value
    24. 4.24. mimes:foo,bar,…
    25. 4.25. min:value
    26. 4.26. not_in:foo,bar,…
    27. 4.27. numeric
    28. 4.28. regex:pattern
    29. 4.29. required
    30. 4.30. required_if:field,value,…
    31. 4.31. required_with:foo,bar,…
    32. 4.32. required_with_all:foo,bar,…
    33. 4.33. required_without:foo,bar,…
    34. 4.34. required_without_all:foo,bar,…
    35. 4.35. same:field
    36. 4.36. size:value
    37. 4.37. timezone
    38. 4.38. unique:table,column,except,idColumn
    39. 4.39. url
  5. 5. Условные правила
  6. 6. Собственные сообщения об ошибках
  7. 7. Собственные правила проверки
Этот перевод актуален для англоязычной документации на (ветка 4.2) , (ветка 4.1) и (ветка 4.0). Опечатка? Выдели и нажми Ctrl+Enter.

Основы использования

Laravel поставляется с простой, удобной системой проверки ввода и получения сообщений об ошибках — классом PHPValidation.

Простейший пример проверки ввода

PHP
$validator Validator::make(
  array(
'name' => 'Дейл'),
  array(
'name' => 'required|min:5')
);

Первый параметр, передаваемый методу PHPValidator::make() — данные для проверки. Второй параметр — правила, которые к ним должны быть применены.

Использование массивов для указания правил

Несколько правил могут быть разделены либо прямой чертой (|), либо быть отдельными элементами массива.

PHP
$validator Validator::make(
  array(
'name' => 'Дейл'),
  array(
'name' => array('required''min:5'))
);

Проверка нескольких полей

PHP
$validator Validator::make(
  array(
    
'name' => 'Дейл',
    
'password' => 'плохойпароль',
    
'email' => 'email@example.com'
  
),
  array(
    
'name' => 'required',
    
'password' => 'required|min:8',
    
'email' => 'required|email|unique:users'
  
)
);

Как только был создан экземпляр PHPValidator, метод PHPfails() (или PHPpasses()) может быть использован для проведения проверки.

PHP
if ($validator->fails()) {
  
// Переданные данные не прошли проверку.
}

Если PHPValidator нашёл ошибки, вы можете получить его сообщения таким образом:

PHP
$messages $validator->messages();

Вы также можете получить массив правил, данные которые не прошли проверку, без самих сообщений:

PHP
$failed $validator->failed();

Проверка файлов

Класс PHPValidator содержит несколько изначальных правил для проверки файлов, такие как size, mimes и другие. Для выполнения проверки над файлами просто передайте эти файлы вместе с другими данными.

Работа с сообщениями об ошибках

После вызова метода PHPValidator::messages() вы получите объект PHPMessageBag, который имеет набор полезных методов для доступа к сообщеням об ошибках.

Получение первого сообщения для поля

PHP
echo $messages->first('email');

Получение всех сообщений для одного поля

PHP
foreach ($messages->get('email') as $message) {
  
//
}

Получение всех сообщений для всех полей

PHP
foreach ($messages->all() as $message) {
  
//
}

Проверка на наличие сообщения для поля

PHP
if ($messages->has('email')) {
  
//
}

Получение ошибки в заданном формате

PHP
echo $messages->first('email''<p>:message</p>');

По умолчанию сообщения форматируются в вид, который подходит для Bootstrap.

Получение всех сообщений в заданном формате

PHP
foreach ($messages->all('<li>:message</li>') as $message) {
  
//
}

Ошибки и шаблоны

Как только вы провели проверку вам понадобиться простой способ, чтобы передать ошибки обратно в шаблон. Laravel позволяет удобно сделать это. Представьте, что у нас есть такие правила:

PHP
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::to('register')->withErrors($validator);
  }
});

Заметьте, что когда проверки не пройдены, мы передаём объект PHPValidator объекту переадресации PHPRedirect с помощью метода PHPwithErrors(). Этот метод сохранит сообщения об ошибках в одноразовых переменных сессии, таким образом делая их доступными для следующего запроса.

Однако мы не всегда должны явно передавать сообщения об ошибках в наших GET-маршрутах. Laravel проверяет данные сессии на наличие сообщений и автоматически привязывает их к шаблону, если они доступны. Таким образом, важно помнить, что переменная PHP$errors будет доступна для всех ваших шаблонов всегда, при любом запросе. Это позволяет вам считать, что переменная PHP$errors всегда определена и может безопасно использоваться. Переменная PHP$errors — экземпляр класса PHPMessageBag.

Таким образом, после переадресации вы можете прибегнуть к автоматически установленной в шаблоне переменной PHP$errors:

PHP
<?php echo $errors->first('email'); ?>
+ 4.2

добавлено в 4.2 ()

Именованные наборы ошибок

Если у вас несколько форм на одной странице, то будет удобно определить название набора PHPMessageBag для ошибок. Это позволит вам получать сообщения об ошибках для конкретной формы. Просто передайте название в качестве второго аргумента в метод PHPwithErrors:

PHP
return Redirect::to('register')->withErrors($validator'login');

Теперь вы можете обращаться к этому экземпляру PHPMessageBag из переменной PHP$errors:

PHP
<?php echo $errors->login->first('email'); ?>

Доступные правила проверки

accepted

Поле должно быть в значении yes, on или 1. Это полезно для проверки принятия правил и лицензий.

active_url

Поле должно быть корректным URL, доступным через функцию checkdnsrr.

after:date

Поле должно быть датой, более поздней, чем date. Строки приводятся к датам функцией strtotime.

alpha

Поле должно содержать только латинские символы.

alpha_dash

Поле должно содержать только латинские символы, цифры, знаки подчёркивания (_) и дефисы (-).

alpha_num

Поле должно содержать только латинские символы и цифры.

+ 4.1

добавлено в 4.1 ()

array

Поле должно быть массивом (тип array).

before:date

Поле должно быть датой, более ранней, чем date. Строки приводятся к датам функцией strtotime.

between:min,max

Поле должно быть числом в диапазоне от min до max. Строки, числа и файлы трактуются аналогично правилу size.

+ 4.2

добавлено в 4.2 ()

boolean

Поле должно соответствовать логическому типу. Доступные значения: true, false, 1, 0, "1" и "0".

confirmed

Значение поля должно соответствовать значению поля с этим именем, плюс _confirmation. Например, если проверяется поле password, то на вход должно быть передано совпадающее по значению поле password_confirmation.

date

Поле должно быть правильной датой в соответствии с функцией strtotime.

date_format:format

Поле должно подходить под формату даты format в соответствии с функцией date_parse_from_format.

different:field

Значение проверяемого поля должно отличаться от значения поля field.

+ 4.1

добавлено в 4.1 ()

digits:value

Поле должно быть числовым и иметь длину, равную value.

+ 4.1

добавлено в 4.1 ()

digits_between:min,max

Поле должно иметь длину в диапазоне между min и max.

email

Поле должно быть корректным адресом e-mail.

exists:table,column

Поле должно существовать в заданной таблице базы данных.

Простое использование

PHP
'state' => 'exists:states'

Указание имени поля в таблице

PHP
'state' => 'exists:states,abbreviation'

Вы также можете указать больше условий, которые будут добавлены к запросу WHERE:

PHP
'email' => 'exists:staff,email,account_id,1'
+ 4.1

добавлено в 4.1 ()

Если передать значение NULL в запрос WHERE, то это добавит проверку значения БД на совпадение с NULL:

PHP
'email' => 'exists:staff,email,deleted_at,NULL'

image

Загруженный файл должен быть изображением в формате JPEG, PNG, BMP или GIF.

in:foo,bar,…

Значение поля должно быть одним из перечисленных (foo, bar и т.д.).

integer

Поле должно иметь корректное целочисленное значение.

ip

Поле должно быть корректным IP-адресом.

max:value

Значение поля должно быть меньше или равно value. Строки, числа и файлы трактуются аналогично правилу size.

mimes:foo,bar,…

MIME-тип загруженного файла должен быть одним из перечисленных.

Простое использование

PHP
'photo' => 'mimes:jpeg,bmp,png'

min:value

Значение поля должно быть более value. Строки, числа и файлы трактуются аналогично правилу size.

not_in:foo,bar,…

Значение поля не должно быть одним из перечисленных (foo, bar и т.д.).

numeric

Поле должно иметь корректное числовое или дробное значение.

regex:pattern

Поле должно соответствовать заданному регулярному выражению.

Внимание: при использовании этого правила может быть нужно перечислять другие правила в виде элементов массива, особенно если выражение содержит символ вертикальной черты (|).

required

Проверяемое поле должно иметь непустое значение.

required_if:field,value,…

Проверяемое поле должно иметь непустое значение, если другое поле field имеет любое значение value (начиная с версии 4.2 можно передать больше одного value через запятую — прим. пер.).

required_with:foo,bar,…

Проверяемое поле должно иметь непустое значение, но только если присутствует любое из перечисленных полей (foo, bar и т.д.).

+ 4.1

добавлено в 4.1 ()

required_with_all:foo,bar,…

Проверяемое поле должно иметь непустое значение, но только если присутствует все перечисленные поля (foo, bar и т.д.).

required_without:foo,bar,…

Проверяемое поле должно иметь непустое значение, но только если не присутствует любое из перечисленных полей (foo, bar и т.д.).

+ 4.1

добавлено в 4.1 ()

required_without_all:foo,bar,…

Проверяемое поле должно иметь непустое значение, но только если не присутствуют все перечисленные поля (foo, bar и т.д.).

same:field

Поле должно иметь то же значение, что и поле field.

size:value

Поле должно иметь совпадающий с value размер. Для строк это обозначает длину, для чисел — число, для файлов — размер в килобайтах.

+ 4.2

добавлено в 4.2 ()

timezone

Поле должно содержать корректный идентификатор временной зоны в соответствии с PHP-функцией PHPtimezone_identifiers_list.

unique:table,column,except,idColumn

Значение поля должно быть уникальным в заданной таблице базы данных. Если column не указано, то будет использовано имя поля.

Простое использование

PHP
'email' => 'unique:users'

Указание имени поля в таблице

PHP
'email' => 'unique:users,email_address'

Игнорирование определённого ID

PHP
'email' => 'unique:users,email_address,10'

Добавление дополнительных условий

Вы также можете указать больше условий, которые будут добавлены к запросу WHERE:

PHP
'email' => 'unique:users,email_address,NULL,id,account_id,1'

В правиле выше только строки с account_id равном 1 будут включены в проверку.

url

Поле должно быть корректным URL.

Эта функция использует PHP-метод PHPfilter_var().

Условные правила

+ 4.1

добавлено в 4.1 ()

В некоторых случаях вам нужно запускать проверки поля, только если оно есть во входном массиве. Чтобы быстро это сделать, добавьте правило sometimes в ваш список правил:

PHP
$v Validator::make($data, array(
  
'email' => 'sometimes|required|email',
));

В этом примере поле email будет проверено, только если оно есть в массиве $data.

Сложные условные проверки

Иногда вам может быть нужно, чтобы поле имело какое-либо значение только если другое поле имеет значение, скажем, больше 100. Или вы можете требовать наличия двух полей только, когда также указано третье. Это легко достигается условными правилами. Сперва создайте объект PHPValidator с набором статичных правил, которые никогда не изменяются:

PHP
$v Validator::make($data, array(
  
'email' => 'required|email',
  
'games' => 'required|numeric',
));

Теперь предположим, что ваше приложения написано для коллекционеров игр. Если регистрируется коллекционер с более, чем 100 играми, то мы хотим их спросить, зачем им такое количество. Например, у них может быть магазин или может им просто нравится их собирать. Итак, для добавления такого условного правила мы используем метод PHPValidator::sometimes():

PHP
$v->sometimes('reason''required|max:500', function ($input) {
  return 
$input->games >= 100;
});

Первый параметр этого метода — имя поля, которое мы проверяем. Второй параметр — правило, которое мы хотим добавить, если переданная функция-замыкание (третий параметр) вернёт PHPtrue. Этот метод позволяет легко создавать сложные правила проверки ввода. Вы можете даже добавлять одни и те же условные правила для нескольких полей одновременно:

PHP
$v->sometimes(array('reason''cost'), 'required', function ($input) {
  return 
$input->games >= 100;
});

Параметр PHP$input, передаваемый замыканию — объект PHPIlluminate\Support\Fluent и может использоваться для чтения проверяемого ввода и файлов.

Собственные сообщения об ошибках

Вы можете передать собственные сообщения об ошибках вместо используемых по умолчанию. Есть несколько способов это сделать.

Передача своих сообщений в PHPValidator

PHP
$messages = array(
  
'required' => 'Поле :attribute должно быть заполнено.',
);

$validator Validator::make($input$rules$messages);

Строка :attribute будет заменена на имя проверяемого поля. Вы также можете использовать и другие строки-переменные.

Использование других переменных-строк

PHP
$messages = array(
  
'same'    => 'Значения :attribute и :other должны совпадать.',
  
'size'    => 'Поле :attribute должно быть ровно exactly :size.',
  
'between' => 'Значение :attribute должно быть от :min и до :max.',
  
'in'      => 'Поле :attribute должно иметь одно из следующих значений: :values',
);

Указание собственного сообщения для отдельного поля

Иногда вам может потребоваться указать своё сообщение для отдельного поля:

PHP
$messages = array(
  
'email.required' => 'Нам нужно знать ваш e-mail адрес!',
);

Указание собственных сообщений в языковом файле

Может быть также полезно определять эти сообщения в языковом файле вместо того, чтобы передавать их в PHPValidator напрямую. Для этого добавьте сообщения в массив custom языкового файла app/lang/xx/validation.php.

PHP
'custom' => array(
  
'email' => array(
    
'required' => 'Нам нужно знать ваш e-mail адрес!',
  ),
),

Собственные правила проверки

Регистрация собственного правила

Laravel изначально содержит множество полезных правил, однако вам может понадобиться создать собственные. Одним из способов зарегистрировать произвольное правило — через метод PHPValidator::extend():

PHP
Validator::extend('foo', function ($attribute$value$parameters) {
  return 
$value == 'foo';
});

Переданная функция-замыкание получает три параметра: имя проверяемого поля PHP$attribute, значение поля PHP$value и массив параметров PHP$parameters, переданных правилу.

Вместо замыкания в метод PHPextend() также можно передать ссылку на метод класса:

PHP
Validator::extend('foo''FooValidator@validate');

Обратите внимание, что вам также понадобиться определить сообщение об ошибке для нового правила. Вы можете сделать это либо передавая его в виде массива строк в PHPValidator, либо вписав в языковой файл.

Расширение класса PHPValidator

Вместо использования функций-замыканий для расширения набора доступных правил вы можете расширить сам класс PHPValidator. Для этого создайте класс, который наследует PHPIlluminate\Validation\Validator. Вы можете добавить новые методы проверок, начав их имя с validate:

PHP
<?php

  
class CustomValidator extends Illuminate\Validation\Validator {

    public function 
validateFoo($attribute$value$parameters)
    {
      return 
$value == 'значение';
    }

  }

Регистрация нового класса PHPValidator

Затем вам нужно зарегистрировать собственное расширение:

PHP
Validator::resolver(function ($translator$data$rules$messages) {
  return new 
CustomValidator($translator$data$rules$messages);
});

Иногда при создании своего класса вам может понадобиться определить собственные строки-переменные для замены в сообщениях об ошибках. Это делается путём создания класса, как было описано выше, и добавлением функций с именами вида PHPreplaceXXX().

PHP
protected function replaceFoo ($message$attribute$rule$parameters) {
  return 
str_replace(':foo'$parameters[0], $message);
}
+ 4.1

добавлено в 4.1 ()

Если вы хотите добавить собственный «заменитель» сообщений без наследования класса PHPValidator, используйте метод PHPValidator::replacer():

PHP
Validator::replacer('rule', function($message$attribute$rule$parameters)
{
  
//
});

Комментарии (1)

RomanBush

Чуть поподробнее про вот этот способ:
Validator::extend('foo', 'FooValidator@validate');
Рассказываю про ларавель 6+.
Создаём свой класс (в отдельном файле, конечно же), который ни от кого не наследуем. Его обязательно надо положить туда, где его подхватит автозагрузка классов. Это, например — app/, или любая созданная папка внутри app, например, app/validators/, или уже существующая папка, например, app/Http/Controllers/ если вам так нравится.
Дальше пишем в методе boot вашего сервис провайдера (который app/Providers/AppServiceProvider.php):

Validator::extend('foo', 'FooValidator@validate');

Здесь — foo — имя правила, которое вы потом будете использовать для вызова своего класса. FooValidator — имя вашего класса, а validate — имя метода внутри класса, который и будет вызываться.
Внимание, нюанс, над которым я бился два дня, не понимая, какого чёрта мой класс не виден: путь к классу надо указывать полностью!
То есть, если вы положили ваш класс в app/validators/, то надо написать так:

Validator::extend('foo', 'App\validators\FooValidator@validate');

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.