{{TOC}} {{DOCVER 4.0=0da300f6445bec5a70d007f503834fce957b065b 16.10.2014 5:19:26, 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03, 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15}} == Основы использования == Laravel поставляется с простой, удобной системой проверки ввода и получения сообщений об ошибках - классом %%Validation%%. **Простейший пример проверки ввода** %% $validator = Validator::make( array('name' => 'Дейл'), array('name' => 'required|min:5') ); %% Первый параметр, передаваемый методу %%Validator::make()%% - данные для проверки. Второй параметр - правила, которые к ним должны быть применены. **Использование массивов для указания правил** Несколько правил могут быть разделены либо прямой чертой (%%(t)|%%), либо быть отдельными элементами массива. %% $validator = Validator::make( array('name' => 'Дейл'), array('name' => array('required', 'min:5')) ); %% **Проверка нескольких полей** %% $validator = Validator::make( array( 'name' => 'Дейл', 'password' => 'плохойпароль', 'email' => 'email@example.com' ), array( 'name' => 'required', 'password' => 'required|min:8', 'email' => 'required|email|unique:users' ) ); %% Как только был создан экземпляр %%Validator%%, метод %%fails()%% (или %%passes()%%) может быть использован для проведения проверки. %% if ($validator->fails()) { // Переданные данные не прошли проверку. } %% Если %%Validator%% нашёл ошибки, вы можете получить его сообщения таким образом: %% $messages = $validator->messages(); %% Вы также можете получить массив правил, данные которые не прошли проверку, без самих сообщений: %% $failed = $validator->failed(); %% **Проверка файлов** Класс %%Validator%% содержит несколько изначальных правил для проверки файлов, такие как %%(t)size%%, %%(t)mimes%% и другие. Для выполнения проверки над файлами просто передайте эти файлы вместе с другими данными. == Работа с сообщениями об ошибках == После вызова метода %%Validator::messages()%% вы получите объект %%MessageBag%%, который имеет набор полезных методов для доступа к сообщеням об ошибках. **Получение первого сообщения для поля** %% echo $messages->first('email'); %% **Получение всех сообщений для одного поля** %% foreach ($messages->get('email') as $message) { // } %% **Получение всех сообщений для всех полей** %% foreach ($messages->all() as $message) { // } %% **Проверка на наличие сообщения для поля** %% if ($messages->has('email')) { // } %% **Получение ошибки в заданном формате** %% echo $messages->first('email', '

:message

'); %% .(alert) По умолчанию сообщения форматируются в вид, который подходит для ((http://getbootstrap.com Bootstrap)). **Получение всех сообщений в заданном формате** %% foreach ($messages->all('
  • :message
  • ') as $message) { // } %% == Ошибки и шаблоны == Как только вы провели проверку вам понадобиться простой способ, чтобы передать ошибки обратно в ((docs/v4/templates шаблон)). 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::to('register')->withErrors($validator); } }); %% Заметьте, что когда проверки не пройдены, мы передаём объект %%Validator%% объекту переадресации %%Redirect%% с помощью метода %%withErrors()%%. Этот метод сохранит сообщения об ошибках в ((docs/v4/session#одноразовы+е))х переменных ((docs/v4/session сессии)), таким образом делая их доступными для следующего запроса. Однако мы не всегда должны явно передавать сообщения об ошибках в наших GET-((docs/v4/routing маршрутах)). Laravel проверяет данные сессии на наличие сообщений и автоматически привязывает их к шаблону, если они доступны. **Таким образом, важно помнить, что переменная %%$errors%% будет доступна для всех ваших шаблонов всегда, при любом запросе.** Это позволяет вам считать, что переменная %%$errors%% всегда определена и может безопасно использоваться. Переменная %%$errors%% - экземпляр класса %%MessageBag%%. Таким образом, после переадресации вы можете прибегнуть к автоматически установленной в шаблоне переменной %%$errors%%: %% first('email'); ?> %% %%(DOCNEW 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15) === Именованные наборы ошибок === Если у вас несколько форм на одной странице, то будет удобно определить название набора %%MessageBag%% для ошибок. Это позволит вам получать сообщения об ошибках для конкретной формы. Просто передайте название в качестве второго аргумента в метод %%withErrors%%: ~%% return Redirect::to('register')->withErrors($validator, 'login'); ~%% Теперь вы можете обращаться к этому экземпляру %%MessageBag%% из переменной %%$errors%%: ~%% login->first('email'); ?> ~%% %% == Доступные правила проверки == === accepted == Поле должно быть в значении %%(t)yes%%, %%(t)on%% или %%(t)1%%. Это полезно для проверки принятия правил и лицензий. === active_url == Поле должно быть корректным URL, доступным через функцию ((php:checkdnsrr)). === after://date// == Поле должно быть датой, более поздней, чем //date//. Строки приводятся к датам функцией ((php:strtotime)). === alpha == Поле должно содержать только латинские символы. === alpha_dash == Поле должно содержать только латинские символы, цифры, знаки подчёркивания (%%(t)_%%) и дефисы (%%(t)-%%). === alpha_num == Поле должно содержать только латинские символы и цифры. %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) === array == Поле должно быть массивом (тип //array//). %% === before://date// == Поле должно быть датой, более ранней, чем //date//. Строки приводятся к датам функцией ((php:strtotime)). === between://min,max// == Поле должно быть числом в диапазоне от //min// до //max//. Строки, числа и файлы трактуются аналогично правилу ((#size)). %%(DOCNEW 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15) === boolean === Поле должно соответствовать логическому типу. Доступные значения: %%(t)true%%, %%(t)false%%, %%(t)1%%, %%(t)0%%, %%(t)"1"%% и %%(t)"0"%%. %% === confirmed == Значение поля должно соответствовать значению поля с этим именем, плюс %%(t)_confirmation%%. Например, если проверяется поле %%(t)password%%, то на вход должно быть передано совпадающее по значению поле %%(t)password_confirmation%%. === date == Поле должно быть правильной датой в соответствии с функцией ((php:strtotime)). === date_format://format// == Поле должно подходить под формату даты //format// в соответствии с функцией ((php:date-parse-from-format date_parse_from_format)). === different://field// == Значение проверяемого поля должно отличаться от значения поля //field//. %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) === digits://value// == Поле должно быть числовым и иметь длину, равную //value//. %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) === digits_between://min,max// == Поле должно иметь длину в диапазоне между //min// и //max//. %% === email == Поле должно быть корректным адресом e-mail. === exists://table,column// == Поле должно существовать в заданной таблице базы данных. **Простое использование** %% 'state' => 'exists:states' %% **Указание имени поля в таблице** %% 'state' => 'exists:states,abbreviation' %% Вы также можете указать больше условий, которые будут добавлены к запросу %%(t)WHERE%%: %% 'email' => 'exists:staff,email,account_id,1' %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) Если передать значение %%(t)NULL%% в запрос %%(t)WHERE%%, то это добавит проверку значения БД на совпадение с %%(t)NULL%%: ~%% '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))-тип загруженного файла должен быть одним из перечисленных. **Простое использование** %% 'photo' => 'mimes:jpeg,bmp,png' %% === min://value// == Значение поля должно быть более //value//. Строки, числа и файлы трактуются аналогично правилу ((#size)). === not_in://foo,bar//,... == Значение поля **не** должно быть одним из перечисленных (//foo//, //bar// и т.д.). === numeric == Поле должно иметь корректное числовое или дробное значение. === regex://pattern// == Поле должно соответствовать заданному регулярному выражению. .(alert) **Внимание:** при использовании этого правила может быть нужно перечислять другие правила в виде элементов массива, особенно если выражение содержит символ вертикальной черты (%%(t)|%%). === required == Проверяемое поле должно иметь непустое значение. === required_if://field,value//,... == Проверяемое поле должно иметь непустое значение, если другое поле //field// имеет любое значение //value// (!!(tl_note) начиная с версии 4.2 можно передать больше одного //value// через запятую - //прим. пер.//!!). === required_with://foo,bar//,... == Проверяемое поле должно иметь непустое значение, но только если присутствует любое из перечисленных полей (//foo//, //bar// и т.д.). %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) === required_with_all://foo,bar//,... == Проверяемое поле должно иметь непустое значение, но только если присутствует все перечисленные поля (//foo//, //bar// и т.д.). %% === required_without://foo,bar//,... == Проверяемое поле должно иметь непустое значение, но только если **не** присутствует любое из перечисленных полей (//foo//, //bar// и т.д.). %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) === required_without_all://foo,bar//,... == Проверяемое поле должно иметь непустое значение, но только если **не** присутствуют все перечисленные поля (//foo//, //bar// и т.д.). %% === same://field// == Поле должно иметь то же значение, что и поле //field//. === size://value// == Поле должно иметь совпадающий с //value// размер. **Для строк** это обозначает длину, **для чисел** - число, **для файлов** - размер в килобайтах. %%(DOCNEW 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15) === 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' %% **Добавление дополнительных условий** Вы также можете указать больше условий, которые будут добавлены к запросу %%(t)WHERE%%: %% 'email' => 'unique:users,email_address,NULL,id,account_id,1' %% В правиле выше только строки с %%(t)account_id%% равном 1 будут включены в проверку. === url == Поле должно быть корректным URL. .(alert) Эта функция использует PHP-метод %%filter_var()%%. == Условные правила == %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 6:21:03) В некоторых случаях вам нужно запускать проверки поля, **только** если оно есть во входном массиве. Чтобы быстро это сделать, добавьте правило %%(t)sometimes%% в ваш список правил: ~%% $v = Validator::make($data, array( 'email' => 'sometimes|required|email', )); ~%% В этом примере поле %%(t)email%% будет проверено, только если оно есть в массиве %%(t)$data%%. %% **Сложные условные проверки** Иногда вам может быть нужно, чтобы поле имело какое-либо значение только если другое поле имеет значение, скажем, больше 100. Или вы можете требовать наличия двух полей только, когда также указано третье. Это легко достигается условными правилами. Сперва создайте объект %%Validator%% с набором статичных правил, которые никогда не изменяются: %% $v = Validator::make($data, array( 'email' => 'required|email', 'games' => 'required|numeric', )); %% Теперь предположим, что ваше приложения написано для коллекционеров игр. Если регистрируется коллекционер с более, чем 100 играми, то мы хотим их спросить, зачем им такое количество. Например, у них может быть магазин или может им просто нравится их собирать. Итак, для добавления такого условного правила мы используем метод %%Validator::sometimes()%%: %% $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; }); %% .(alert) Параметр %%$input%%, передаваемый замыканию - объект %%Illuminate\Support\Fluent%% и может использоваться для чтения проверяемого ввода и файлов. == ((#сообщения)) Собственные сообщения об ошибках == Вы можете передать собственные сообщения об ошибках вместо используемых по умолчанию. Есть несколько способов это сделать. **Передача своих сообщений в %%Validator%%** %% $messages = array( 'required' => 'Поле :attribute должно быть заполнено.', ); $validator = Validator::make($input, $rules, $messages); %% .(alert) Строка %%(t):attribute%% будет заменена на имя проверяемого поля. Вы также можете использовать и другие строки-переменные. **Использование других переменных-строк** %% $messages = array( 'same' => 'Значения :attribute и :other должны совпадать.', 'size' => 'Поле :attribute должно быть ровно exactly :size.', 'between' => 'Значение :attribute должно быть от :min и до :max.', 'in' => 'Поле :attribute должно иметь одно из следующих значений: :values', ); %% **Указание собственного сообщения для отдельного поля** Иногда вам может потребоваться указать своё сообщение для отдельного поля: %% $messages = array( 'email.required' => 'Нам нужно знать ваш e-mail адрес!', ); %% **Указание собственных сообщений в языковом файле** Может быть также полезно определять эти сообщения в языковом файле вместо того, чтобы передавать их в %%Validator%% напрямую. Для этого добавьте сообщения в массив %%(t)custom%% языкового файла %%(t)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%%. Вы можете добавить новые методы проверок, начав их имя с %%(t)validate%%: %%