{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} == Введение == Laravel предоставляет несколько разных подходов к проверке входящих в ваше приложение данных. По умолчанию базовый класс контроллера использует типаж %%(t)ValidatesRequests%%, который предоставляет удобный метод проверки входящего HTTP-запроса с помощью различных мощных правил проверки. == Краткое руководство по проверке ввода == Для изучения мощных возможностей проверки ввода в Laravel, давайте рассмотрим полный пример проверки ввода через форму и вывода сообщений об ошибках. === Определение маршрутов === Сначала давайте предположим, что у нас есть следующие маршруты, определённые в файле %%(t)routes/web.php%%: %% Route::get('post/create', 'PostController@create'); Route::post('post', 'PostController@store'); %% Очевидно, маршрут %%(t)GET%% выведет пользователю форму для написания новой статьи, а маршрут %%(t)POST%% сохранит её в БД. == Создание контроллера == Теперь давайте посмотрим на простой контроллер, который обрабатывает эти маршруты. Метод %%store()%% мы пока оставим пустым: %% validate($request, [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]); // Статья прошла проверку, сохранение в БД... } %% Как видите, мы просто передали входящий HTTP-запрос и требуемые правила проверки в метод %%validate()%%. Если проверка провалится, будет сгенерирован соответствующий отклик. Если проверка успешна, ваш контроллер продолжит нормально выполняться. %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) **Остановка после первой ошибки ввода** Иногда надо остановить выполнение правил проверки ввода для атрибута после первой ошибки. Для этого назначьте на атрибут правило %%(t)bail%%: ~%% $this->validate($request, [ 'title' => 'bail|required|unique:posts|max:255', 'body' => 'required', ]); ~%% Если правило %%(t)required%% на атрибуте %%(t)title%% не выполнится, то правило %%(t)unique%% не будет проверяться. Правила будут проверены в порядке их назначения. %% **Замечание о вложенных атрибутах** Если ваш HTTP-запрос содержит "вложенные" параметры, вы можете указать их в правилах проверки с помощью "точечной" записи: %% $this->validate($request, [ 'title' => 'required|unique:posts|max:255', 'author.name' => 'required', 'author.description' => 'required', ]); %% === Вывод ошибок === Что будет, если параметры входящего запроса не пройдут проверку? Как уже было сказано, Laravel автоматически перенаправит пользователя на предыдущую страницу. Вдобавок, все ошибки будут автоматически ((/docs/v5/session#одноразовые отправлены в сессию)). Заметьте, мы не привязывали сообщения об ошибках к представлению в нашем маршруте %%(t)GET%%. Потому что Laravel проверяет наличие ошибок в данных сессии и автоматически привязывает их к представлению, если они доступны. **Поэтому важно помнить, что переменная %%$errors%% будет всегда доступна во всех ваших представлениях при каждом запросе**, позволяя вам всегда рассчитывать на то, что она определена и может быть безопасно использована. Переменная %%$errors%% будет экземпляром %%(t)Illuminate\Support\MessageBag%%. Более подробно о работе с этим объектом читайте ((/docs/v5/validation#работа_с_сообщениями_об_ошибках в его документации)). Переменная %%$errors%% привязывается к представлению посредником %%(t)Illuminate\View\Middleware\ShareErrorsFromSession%%, который входит в состав группы посредников %%(t)web%%. Итак, в нашем примере при неудачной проверке пользователь будет перенаправлен в метод %%create()%% нашего контроллера, позволяя нам вывести сообщения об ошибках в представлении: %%

Написать статью

@if (count($errors) > 0)
@endif %% **Настройка формата передачи ошибок** Чтобы настроить формат ошибок проверки, передаваемых в сессию при их возникновении, переопределите %%(t)formatValidationErrors%% в базовом контроллере. Не забудьте импортировать класс %%(t)Illuminate\Contracts\Validation\Validator%% (для Laravel 5.0 %%(t)Illuminate\Validation\Validator%%) в начале файла: %% errors()->all(); } } %% **AJAX-запросы и проверка ввода** В этом примере мы использовали обычную форму для отправки данных в приложение. Но многие приложения используют AJAX-запросы. При использовании метода %%validate()%% для AJAX-запросов Laravel не создаёт отклик-переадресацию. Вместо этого Laravel создаёт JSON-отклик, содержащий все возникшие при проверке ошибки. Этот JSON-отклик будет отправлен с HTTP-кодом состояния 422. == Проверка запроса формы == === Создание запроса формы === Для более сложных сценариев проверки вам может понадобиться "запрос формы". Запросы формы - изменённые классы запросов, содержащие логику проверки. Для создания класса запроса формы используйте Artisan-команду %%(sh)make:request%%: %%(sh) php artisan make:request StoreBlogPost %% Сгенерированный класс будет помещён в папку %%(t)app/Http/Requests%%. Если такой папки нет, она будет создана при запуске команды %%(sh)make:request%%. Давайте добавим несколько правил проверки в метод %%rules()%%: %% /** * Получить правила проверки для применения к запросу. * * @return array */ public function rules() { return [ 'title' => 'required|unique|max:255', 'body' => 'required', ]; } %% А как же запускаются правила проверки? Надо просто указать тип запроса в методе контроллера. Входящий запрос формы проверяется до вызова метода контроллера, это значит, что вам не надо захламлять ваш контроллер логикой проверки: %% /** * Сохранить входящую статью. * * @param StoreBlogPost $request * @return Response */ public function store(StoreBlogPost $request) { // Входящий запрос прошёл проверку... } %% Если проверка неуспешна, будет сгенерирован отклик-переадресация для перенаправления пользователя на предыдущую страницу. Также в сессию будут переданы ошибки, и их можно будет отобразить. Если запрос был AJAX-запросом, то пользователю будет возвращён HTTP-отклик с кодом состояния 422, содержащий JSON-представление ошибок проверки. === Авторизация запроса формы === Класс запроса формы также содержит метод %%authorize()%%. Этим методом вы можете проверить, действительно ли у авторизованного пользователя есть право на изменение данного ресурса. Например, вы можете определить, является ли пользователь владельцем комментария, который он пытается изменить: %% /** * Определить, авторизован ли пользователь для этого запроса. * * @return bool */ public function authorize() { $comment = Comment::find($this->route('comment')); return $comment && $this->user()->can('update', $comment); } %% Поскольку все запросы форм наследуют базовый класс запроса Laravel, мы можем использовать метод %%user()%% для получения текущего аутентифицированного пользователя. Также обратите внимание на вызов метода %%route()%% в этом примере. Этот метод даёт вам доступ к параметрам URI, определённым в вызванном маршруте, таким как параметр %%{comment}%% в примере ниже: %% Route::post('comment/{comment}'); %% Если метод %%authorize()%% возвращает %%(t)false%%, то будет автоматически возвращён HTTP-ответ с кодом состояния 403, и метод вашего контроллера не будет выполнен. Если вы планируете разместить логику авторизации в другой части приложения, просто верните %%(t)true%% из метода %%authorize()%%: %% /** * Определить, авторизован ли пользователь для этого запроса. * * @return bool */ public function authorize() { return true; } %% === Настройка формата ошибок === Если хотите настроить формат сообщений об ошибках ввода, передаваемых в сессию при их возникновении, переопределите %%formatErrors()%% в вашем базовом запросе (%%(t)App\Http\Requests\Request%%). Не забудьте импортировать класс %%(t)Illuminate\Contracts\Validation\Validator%% в начале файла: %% /** * {@inheritdoc} */ protected function formatErrors(Validator $validator) { return $validator->errors()->all(); } %% === Настройка сообщений об ошибках === Для настройки сообщений об ошибках, используемых запросом формы, переопределите метод %%messages()%%. Этот метод должен возвращать массив пар атрибут/правило и соответствующие им сообщения об ошибках: %% /** * Получить сообщения об ошибках для определённых правил проверки. * * @return array */ public function messages() { return [ 'title.required' => 'Необходимо указать заголовок', 'body.required' => 'Необходимо написать статью', ]; } %% == Создание валидаторов вручную == Если вы не хотите использовать метод %%validate()%% типажа %%(t)ValidatesRequests%%, вы можете создать экземпляр валидатора вручную с помощью ((/docs/v5/facades фасада)) %%(t)Validator%%. Метод %%make()%% этого фасада создаёт новый экземпляр валидатора: %% all(), [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ]); if ($validator->fails()) { return redirect('post/create') ->withErrors($validator) ->withInput(); } // Сохранить статью... } } %% Первый аргумент метода %%make()%% - данные для проверки. Второй - правила, которые должны быть применены к этим данным. Если запрос не пройдёт проверку, вы можете использовать метод %%withErrors()%%, чтобы передать сообщения об ошибках в сессию. При использовании этого метода переменная %%$errors%% автоматически станет общей для ваших представлений после переадресации, позволяя вам легко выводить их пользователю. Метод %%withErrors()%% принимает валидатор, %%(t)MessageBag%% или PHP-массив. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) === Автоматическая переадресация === Если вы хотите создать экземпляр валидатора вручную, но при этом иметь возможность автоматической переадресации, предлагаемой типажом %%(t)ValidatesRequest%%, то можете вызвать метод %%validate()%% на существующем экземпляре валидатора. Если при проверке обнаружатся ошибки, пользователь будет автоматически переадресован, а в случае AJAX-запроса будет возвращён JSON-отклик: ~%% Validator::make($request->all(), [ 'title' => 'required|unique:posts|max:255', 'body' => 'required', ])->validate(); ~%% %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Использование массивов для указания правил** Несколько правил могут быть разделены либо прямой чертой (%%(t)|%%), либо быть отдельными элементами массива. ~%% $validator = Validator::make( ['name' => 'Ваня'], ['name' => ['required', 'min:5']] ); ~%% **Проверка нескольких полей** ~%% $validator = Validator::make( [ 'name' => 'Ваня', 'password' => 'плохойпароль', 'email' => 'email@example.com' ], [ 'name' => 'required', 'password' => 'required|min:8', 'email' => 'required|email|unique:users' ] ); ~%% Когда создан экземпляр %%Validator%%, метод %%fails()%% (или %%passes()%%) может быть использован для проведения проверки. ~%% if ($validator->fails()) { // Переданные данные не прошли проверку } ~%% Если валидатор нашёл ошибки, вы можете получить его сообщения таким образом: ~%% $messages = $validator->messages(); ~%% Вы также можете получить массив правил, по которым данные не прошли проверку, без самих сообщений - с помощью метода %%failed()%%: ~%% $failed = $validator->failed(); ~%% %% === Именованные наборы ошибок === Если у вас несколько форм на одной странице, вы можете дать имена наборам ошибок %%(t)MessageBag%%, и получать сообщения об ошибках для конкретной формы. Просто передайте имя вторым аргументом метода %%withErrors()%%: %% return redirect('register') ->withErrors($validator, 'login'); %% Теперь вы можете обращаться к экземпляру %%(t)MessageBag%% из переменной %%$errors%%: %% {{ $errors->login->first('email') }} %% === Вебхук после проверки === Валидатор также позволяет прикрепить обратные вызовы, которые будут запущены после завершения проверки. Это позволяет легко выполнять последующие проверки, а также добавлять сообщения об ошибках в коллекцию сообщений. Для начала используйте метод %%after()%% на экземпляре класса %%Validator%%: %% $validator = Validator::make(...); $validator->after(function($validator) { if ($this->somethingElseIsInvalid()) { $validator->errors()->add('field', 'В этом поле что-то не так!'); } }); if ($validator->fails()) { // } %% == ((#работа_с_сообщениями_об_ошибках)) Работа с сообщениями об ошибках == После вызова метода %%errors()%% (для Laravel 5.0 %%messages()%%) на экземпляре %%(t)Validator%% вы получите объект %%Illuminate\Support\MessageBag%%, который имеет набор полезных методов для работы с сообщениями об ошибках. Переменная %%$errors%%, которая автоматически становится доступной всем представлениям, также является экземпляром класса %%(t)MessageBag%%. **Получение первого сообщения для поля** Для получения первого сообщения об ошибке для данного поля используйте метод %%first()%%: %% $errors = $validator->errors(); echo $errors->first('email'); %% **Получение всех сообщений для одного поля** Для получения массива всех сообщений для данного поля используйте метод %%get()%%: %% foreach ($errors->get('email') as $message) { // } %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) При проверке массива из поля вы можете получить все сообщения по каждому элементу массива с помощью символа %%*%%: ~%% foreach ($errors->get('attachments.*') as $message) { // } ~%% %% **Получение всех сообщений для всех полей** Для получения массива всех сообщения для всех полей используйте метод %%all()%%: %% foreach ($errors->all() as $message) { // } %% **Проверка наличия сообщения для поля** Для определения наличия сообщений об ошибках для определённого поля служит метод %%has()%%: %% if ($messages->has('email')) { // } %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Получение ошибки в заданном формате** ~%% echo $messages->first('email', '

:message

'); ~%% .(alert) По умолчанию сообщения форматируются в вид, который подходит для ((http://getbootstrap.com Bootstrap)). **Получение всех сообщений в заданном формате** ~%% foreach ($messages->all('
  • :message
  • ') as $message) { // } ~%% %% === ((#сообщения)) Изменение сообщений об ошибках === При необходимости вы можете задать свои сообщения об ошибках проверки ввода вместо изначальных. Для этого есть несколько способов. Во-первых, вы можете передать свои сообщения третьим аргументом метода %%Validator::make()%%: %% $messages = [ 'required' => 'Необходимо указать :attribute.', ]; $validator = Validator::make($input, $rules, $messages); %% В этом примере обозначение %%(t):attribute%% будет заменено именем проверяемого поля. Вы можете использовать и другие обозначения. Например: %% $messages = [ 'same' => ':attribute и :other должны совпадать.', 'size' => ':attribute должен быть равен :size.', 'between' => ':attribute должен быть между :min и :max.', 'in' => ':attribute должен иметь один из следующих типов: :values', ]; %% **Указание своего сообщения для конкретного атрибута** Иногда вам может понадобиться указать своё сообщения только для конкретного поля. Вы можете сделать это с помощью "точечной" записи. Сначала укажите имя атрибута, а затем правило: %% $messages = [ 'email.required' => 'Нам надо знать ваш e-mail!', ]; %% **Указание своих сообщений в языковых файлах** В большинстве случаев вы будете указывать свои сообщения в языковом файле, а не передавать их напрямую в %%(t)Validator%%. Для этого добавьте свои сообщения в массив %%(t)custom%% в языковом файле %%(t)resources/lang/xx/validation.php%%: %% 'custom' => [ 'email' => [ 'required' => 'Нам надо знать ваш e-mail!', ], ], %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) **Указание своих атрибутов в языковых файлах** Если вы хотите заменить часть %%:attribute%% в своём сообщении о проверке ввода на своё имя атрибута, вы можете указать своё имя в массиве %%(t)attributes%% в языковом файле %%(t)resources/lang/xx/validation.php%%: ~%% 'attributes' => [ 'email' => 'email address', ], ~%% %% == Доступные правила проверки == === accepted === Поле должно быть в значении %%(t)yes%%, %%(t)on%%, %%(t)1%% или %%(t)true%%. Это полезно для проверки принятия правил и лицензий. === active_url === %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Поле должно иметь корректную запись A или AAAA согласно PHP-функции ((php:dns_get_record)). %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Поле должно быть корректным URL согласно PHP-функции ((php:checkdnsrr)). %% === after://date// === Поле должно быть датой, более поздней, чем //date//. Строки приводятся к датам функцией ((php:strtotime)): %% 'start_date' => 'required|date|after:tomorrow' %% Вместо того, чтобы передавать строку-дату в ((php:strtotime)), вы можете указать другое поле для сравнения с датой: %% 'finish_date' => 'required|date|after:start_date' %% === alpha === Поле должно содержать только латинские символы. === alpha_dash === Поле должно содержать только латинские символы, цифры, знаки подчёркивания (%%(t)_%%) и дефисы (%%(t)-%%). === alpha_num === Поле должно содержать только латинские символы и цифры. === array === Поле должно быть PHP-массивом (тип //array//). === before://date// === Поле должно быть датой, более ранней, чем //date//. Строки приводятся к датам функцией ((php:strtotime)). === between://min,max// === Поле должно быть числом в диапазоне от //min// до //max//. Строки, числа и файлы трактуются аналогично правилу %%size%%. === boolean === Поле должно соответствовать логическому типу. Доступные значения: %%(t)true%%, %%(t)false%%, %%(t)1%%, %%(t)0%%, %%(t)"1"%% и %%(t)"0"%%. === confirmed === Значение поля должно соответствовать значению поля с этим именем, плюс %%(t)_confirmation%%. Например, если проверяется поле %%(t)password%%, то на вход должно быть передано совпадающее по значению поле %%(t)password_confirmation%%. === date == Поле должно быть правильной датой в соответствии с PHP-функцией ((php:strtotime)). === date_format://format// === Поле должно подходить под заданный формат. При проверке поля вы должны использовать **либо** %%(t)date%%, **либо** %%(t)date_format%%, но не оба сразу. === different://field// === Значение проверяемого поля должно отличаться от значения поля //field//. === digits://value// === Поле должно быть //числовым// и иметь длину, равную //value//. === digits_between://min,max// === Поле должно иметь длину в диапазоне между //min// и //max//. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) === dimensions === Файл должен быть изображением с подходящими под ограничения размерами, которые указаны в параметрах правила: ~%% 'avatar' => 'dimensions:min_width=100,min_height=200' ~%% Доступные ограничения: //min_width//, //max_width//, //min_height//, //max_height//, //width//, //height//, //ratio//. Ограничение //ratio// должно быть задано в виде ширины, поделённой на высоту. Это можно указать выражением вида %%3/2%% или в виде нецелого числа %%1.5%%: ~%% 'avatar' => 'dimensions:ratio=3/2' ~%% === distinct === При работе с массивами поле не должно содержать дублирующих значений. ~%% 'foo.*.id' => 'distinct' ~%% %% === email === Поле должно быть корректным адресом e-mail. === exists://table,column// === Поле должно существовать в заданной таблице базы данных. **Простое использование** %% 'state' => 'exists:states' %% **Указание имени поля в таблице** %% 'state' => 'exists:states,abbreviation' %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Вы также можете указать больше условий, которые будут добавлены к запросу %%(t)WHERE%%: ~%% 'email' => 'exists:staff,email,account_id,1' ~%% Это условие можно обратить с помощью знака %%(t)!%% : ~%% 'email' => 'exists:staff,email,role,!admin' ~%% Если передать значение %%(t)NULL%%/%%(t)NOT_NULL%% в запрос %%(t)WHERE%%, то это добавит проверку значения БД на совпадение с %%(t)NULL%%/%%(t)NOT_NULL%%: ~%% 'email' => 'exists:staff,email,deleted_at,NULL' 'email' => 'exists:staff,email,deleted_at,NOT_NULL' ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) Иногда бывает необходимо указать конкретное подключение к базе данных для запроса %%exists%%. Это можно сделать, подставив имя подключения перед именем таблицы с помощью "точечного" синтаксиса: ~%% 'email' => 'exists:connection.staff,email' ~%% %% %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Если вы хотите изменить запрос, выполняемый правилом проверки, то можете использовать класс %%(t)Rule%%, чтобы задать правило гибко. В этом примере мы также укажем правила проверки в виде массива, вместо использования символа %%|%% для разделения правил: ~%% use Illuminate\Validation\Rule; Validator::make($data, [ 'email' => [ 'required', Rule::exists('staff')->where(function ($query) { $query->where('account_id', 1); }), ], ]); ~%% %% === file === Поле должно быть успешно загруженным файлом. === filled === Поле не должно быть пустым, если оно есть. === image === Загруженный файл должен быть изображением в формате JPEG, PNG, BMP, GIF или SVG. === in://foo,bar//,... === Значение поля должно быть одним из перечисленных (//foo//, //bar// и т.д.). %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) === in_array://anotherfield// === Значение в поле должно быть одним из значений поля //anotherfield//. %% === integer === Поле должно иметь корректное целочисленное значение. === ip === Поле должно быть корректным IP-адресом. === json === Поле должно быть JSON-строкой. === max://value// === Значение поля должно быть меньше или равно //value//. Строки, числа и файлы трактуются аналогично правилу %%size%%. %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) === mimetypes://text/plain//,... === Файл должен быть одного из перечисленных MIME-типов: ~%% 'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime' ~%% Для определения MIME-типа загруженного файла фреймворк прочитает его содержимое и попытается определить MIME-тип, который может отличаться от указанного клиентом. %% === mimes://foo,bar//,... === ((ВП:MIME))-тип загруженного файла должен быть одним из перечисленных. **Простое использование** %% 'photo' => 'mimes:jpeg,bmp,png' %% Несмотря на то, что вы просто указываете расширение файла, это правило проверяет ((ВП:MIME))-тип файла, обращаясь к его содержимому и распознавая его ((ВП:MIME))-тип. Полный список ((ВП:MIME))-типов и соответствующих им расширений можно найти по ссылке ((https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)). === min://value// === Значение поля должно быть более или равно //value//. Строки, числа и файлы трактуются аналогично правилу %%size%%. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) === nullable === Поле может иметь значение %%null%%. Это особенно полезно при проверке таких примитивов, как строки и числа, которые могут содержать значения %%null%%. %% === not_in://foo//,//bar//,... === Значение поля **не** должно быть одним из перечисленных (//foo//, //bar// и т.д.). === numeric === Поле должно иметь корректное числовое или дробное значение. %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) === present === Поле должно быть в данных ввода, но может быть пустым. %% === regex://pattern// === Поле должно соответствовать заданному регулярному выражению. .(alert) При использовании этого правила может быть необходимо указать другие правила в виде элементов массива, вместо разделения их с помощью символа вертикальной черты, особенно если выражение содержит этот символ вертикальной черты (%%(t)|%%). === required === Проверяемое поле должно иметь непустое значение. Поле считается "пустым", при выполнении одного из следующих условий: * Значение поля - %%(t)NULL%% * Значение поля - пустая строка * Значение поля - пустой массив или пустой %%(t)Countable%%-объект * Значение поля - файл для загрузки без пути === required_if://anotherfield//,//value//,... === Проверяемое поле должно иметь непустое значение, если другое поле //anotherfield// имеет любое значение //value//. === required_unless://anotherfield//,//value//,... === Проверяемое поле должно иметь непустое значение, если другое поле //anotherfield// не имеет значение //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// размер. **Для строк** это обозначает длину, **для чисел** - число, **для массивов** - число элементов массива, **для файлов** - размер в килобайтах. === string === Поле должно быть строкового типа. Если вы хотите разрешить для поля значение %%null%%, назначьте на поле правило %%nullable%%. === timezone === Поле должно содержать корректный идентификатор временной зоны в соответствии с PHP-функцией %%timezone_identifiers_list%%. ((#unique)) === unique://table,column,except,idColumn// === Значение поля должно быть уникальным в заданной таблице базы данных. Если //column// не указано, то будет использовано имя поля. **Указание имени столбца в таблице** %% 'email' => 'unique:users,email_address' %% **Указание соединения с БД** Иногда вам может потребоваться задать собственное соединение для запросов к базе данных от %%Validator%%. Как видно выше, правило проверки %%unique:users%% будет использовать соединение с базой данных по умолчанию для запроса к базе данных. Чтобы изменить это, укажите соединение и имя таблицы, используя "точечную" запись: %% 'email' => 'unique:connection.users,email_address' %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% $verifier = App::make('validation.presence'); $verifier->setConnection('connectionName'); $validator = Validator::make($input, [ 'name' => 'required', 'password' => 'required|min:8', 'email' => 'required|email|unique:users', ]); $validator->setPresenceVerifier($verifier); ~%% %% **Игнорирование определённого ID** Иногда бывает необходимо игнорировать конкретный ID при проверке на уникальность. Например, представим экран "изменения профиля", который содержит имя пользователя, адрес e-mail и местоположение. Разумеется, вы захотите проверить уникальность e-mail. Но если пользователь изменит только поле с именем, и не изменит e-mail, вам надо избежать возникновения ошибки из-за того, что пользователь сам уже является владельцем этого e-mail. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Чтобы валидатор игнорировал ID пользователя, мы используем класс %%(t)Rule%% для гибкого задания правила. В этом примере мы также укажем правила проверки в виде массива, вместо использования символа %%|%% для разделения правил: ~%% use Illuminate\Validation\Rule; Validator::make($data, [ 'email' => [ 'required', Rule::unique('users')->ignore($user->id), ], ]); ~%% Если в вашей таблице используется первичный ключ с именем, отличающимся от %%(t)id%%, укажите его при вызове метода %%ignore()%%: ~%% 'email' => Rule::unique('users')->ignore($user->id, 'user_id') ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Вам надо, чтобы ошибка возникла только в том случае, когда пользователь укажет e-mail, который уже был использован другим пользователем. Чтобы правило проверки на уникальность игнорировало ID пользователя, передайте ID третьим параметром: ~%% 'email' => 'unique:users,email_address,'.$user->id ~%% Если в вашей таблице используется первичный ключ с именем, отличающимся от %%(t)id%%, укажите его четвёртым параметром: ~%% 'email' => 'unique:users,email_address,'.$user->id.',user_id' ~%% %% **Добавление дополнительных условий** %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51) Вы также можете указать дополнительные условия запроса, изменив запрос методом %%where()%%. Например, давайте добавим условие, которое проверяет, что %%account_id%% равно %%1%%: ~%% 'email' => Rule::unique('users')->where(function ($query) { $query->where('account_id', 1); }) ~%% %% %%(DOCNEW 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Вы также можете указать больше условий, которые будут добавлены к запросу %%(t)WHERE%%: ~%% 'email' => 'unique:users,email_address,NULL,id,account_id,1' ~%% В правиле выше только строки с %%(t)account_id%% равным 1 будут включены в проверку. %% === url === Поле должно быть корректным URL. == Условные правила == **Проверять при наличии** В некоторых случаях вам нужно запускать проверки поля, **только** если оно есть во входном массиве. Чтобы быстро это сделать, добавьте правило %%(t)sometimes%% в ваш список правил: %% $v = Validator::make($data, [ 'email' => 'sometimes|required|email', ]); %% В этом примере поле %%(t)email%% будет проверено, только если оно есть в массиве %%(t)$data%%. **Сложные условные проверки** Иногда вам может быть нужно, чтобы поле имело какое-либо значение, только если другое поле имеет значение, скажем, больше 100. Или вы можете требовать наличия двух полей, только когда также указано третье. Это легко достигается условными правилами. Сперва создайте объект %%Validator%% с набором //статичных правил//, которые никогда не изменяются: %% $v = Validator::make($data, [ 'email' => 'required|email', 'games' => 'required|numeric', ]); %% Теперь предположим, что ваше приложения написано для коллекционеров игр. Если регистрируется коллекционер с более, чем 100 играми, то мы хотим его спросить, зачем ему такое количество. Например, у него может быть магазин игр, или может ему просто нравится их собирать. Итак, для добавления такого условного правила мы используем метод %%sometimes()%% на экземпляре %%Validator%%: %% $v->sometimes('reason', 'required|max:500', function ($input) { return $input->games >= 100; }); %% Первый аргумент этого метода - имя поля, которое мы проверяем. Второй аргумент - правило, которое мы хотим добавить, если переданная функция-замыкание (третий аргумент) вернёт %%(t)true%%. Этот метод позволяет легко создавать сложные правила проверки ввода. Вы можете даже добавлять условные правила для нескольких полей одновременно: %% $v->sometimes(['reason', 'cost'], 'required', function ($input) { return $input->games >= 100; }); %% .(alert) Параметр %%$input%%, передаваемый замыканию - объект %%(t)Illuminate\Support\Fluent%% и может использоваться для чтения проверяемого ввода и файлов. %%(DOCNEW 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15) == Проверка ввода массивов == Проверка ввода массива из полей ввода не должна быть сложной. Например, чтобы проверить, что каждый e-mail в данном поле ввода массива уникален, можно сделать так: ~%% $validator = Validator::make($request->all(), [ 'person.*.email' => 'email|unique:users', 'person.*.first_name' => 'required_with:person.*.last_name', ]); ~%% Также вы можете использовать символ %%(t)*%% при задании сообщений об ошибках ввода в языковых файлах, что позволяет легко использовать одно сообщение для полей на основе массивов: ~%% 'custom' => [ 'person.*.email' => [ 'unique' => 'Каждый пользователь должен иметь уникальный адрес e-mail', ] ], ~%% %% == Собственные правила проверки == Laravel содержит множество полезных правил, однако вам может понадобиться создать собственные. Один из способов зарегистрировать произвольное правило - через метод %%Validator::extend()%%. Давайте используем этот метод в ((/docs/v5/providers сервис-провайдере)) для регистрации своего правила: %% "Your input was invalid!", "accepted" => "The :attribute must be accepted.", // Остальные сообщения об ошибках... %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) **Расширение класса %%Validator%%** Вместо использования функций-замыканий для расширения набора доступных правил вы можете расширить сам класс %%Validator%%. Для этого создайте класс, который наследует %%(t)Illuminate\Validation\Validator%%. Вы можете добавить новые методы проверок, начав их имя с %%(t)validate%%: ~%% 'unique']; $input = ['name' => null]; Validator::make($input, $rules)->passes(); // true %% Чтобы применять правило даже для пустых полей, правило должно считать, что поле обязательное. Для создания такого "неявного" наследования используйте метод %%Validator::extendImplicit()%%: %% Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) { return $value == 'foo'; }); %% .(alert) "Неявное" наследование только //указывает// на обязательность поля. А будет ли правило пропускать пустое или отсутствующее поле или нет, зависит от вас.