Пример фильтрации данных
Попробуем сделать пример приложения-блога. В нём будет форма для создания новой публикации. Предположим, что у такого приложения есть несколько маршрутов:<?php
// вывод формы написания статьи
Route::get('post/create', 'PostController@create');
// сохранение статьи
Route::post('post', 'PostController@store');
?>
Теперь напишем контроллер, который будет обрабатывать эти маршруты. Добавим в этот контроллер метод под названием "store", который предполагается использовать для сохранения данных, полученных от пользователя. Очевидно, что в этом метода должна производится валидация данных. Сделаём её с помощью метода "validate":
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller{
public function create() { // выводим форму написания статьи
return view('post.create');
}
public function store(Request $request) { // сохраняем статью
$this->validate($request, [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
}
}
?>
Как можно видеть из кода, данные HTTP запроса были переданы методу "validate". Если проверка будет пройдена успешно, то контроллер выполнится нормально. Но в случае неудачи возникнет исключение и отправлен отклик с сообщением об ошибке.
Правила проверки
Обратите внимание на предыдущий пример, а точнее на массив внутри второго параметра метода "validate". В качестве значений туда передаётся строка с разделителями |, а ключи являются названиями передаваемых полей. Эти элементы содержат различные директивы для фильтрации. В текущем примере были использованы три условия валидацииrequired|unique:posts|max:255
. Первое условие "required" - говорит об обязательности заполнения, второе условие "unique:posts" говорит об обязательной уникальности значения в таблице "posts", а третье "max:255" говорит о максимальной длине строки.
Вместо записи в строку с разделителем "required|unique:posts|max:255" можно использовать простой массив:
Существует множество правил проверки. Часть из них перечислена в конце этой статьи, в параграфе "Доступные правила проверки".
['required', 'unique:posts'. 'max:255']
Вывод ошибок
Если передаваемые параметры не проходят проверку, то Laravel переадресует пользователя на предыдущую страницу. В дополнение к этому ошибка будет отправлена в сессию. При этом крайне важно, чтобы переменная $errors была всегда доступна во всех представлениях при каждом запросе.В нашем примере при возникновении ошибки пользователь будет отправлен в метод "create", где нужно показать ошибку. Тогда в шаблоне необходимо поставить:
<!-- /resources/views/post/create.blade.php -->
<h1>Написать статью</h1>
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Форма написания статьи -->
При использовании метода "validate" для AJAX-запросов Laravel не делает переадресацию при ошибке. Вместо этого Laravel создаёт JSON-отклик, содержащий все данные ошибки. И это сообщение будет отправлено с HTTP-кодом состояния 422.
Доступные правила проверки
Ключ | Описание |
---|---|
accepted | Значение "yes", "on", цифра "1" или логическое "true" |
active_url | Корректнуая запись A или AAAA, которая определяются через PHP-функцию dns_get_record. |
after:date | Дата, более поздняя, чем date. Строка обрабатывается функцией strtotime. Вместо даты можно указать название поля для сравнения. |
alpha | Латинские символы |
alpha_num | Латинские символы, цифры |
alpha_dash | Латинские символы, цифры, знаки подчёркивания (_) и дефисы (-). |
array | PHP-массив |
before:date | Дата, более ранняя, чем date. Строка обрабатывается функцией strtotime. Вместо даты можно указать название поля для сравнения. |
between:min,max | Число в диапазоне от min до max |
boolean | Логический тип: true, false, 1, 0, "1" или "0". |
confirmed | Значение поля с этим именем и суффиксом "_confirmation". Например, если проверяется поле password, то на вход должно быть передано совпадающее по значению поле password_confirmation. |
date | Дата в соответствии с PHP-функцией strtotime. |
date_format:format | Подходит под заданный формат. При проверке поля нужно использовать date или date_format, но не оба сразу |
different:field | Должно отличаться от значения поля field |
digits:value | Число с длиной равной value |
digits_between:min,max | Число с длиной в диапазоне между min и max |
dimensions | Файл должен быть изображением с подходящими под ограничения размерами (min_width, max_width, min_height, max_height, width, height, ratio), которые указаны в параметрах правила: 'dimensions:min_width=100,min_height=200' . Ограничение ratio должно быть задано в виде ширины: 3/2 или 16/9 |
distinct | Массив не должен содержать дублирующих значений |
Корректный адрес e-mail | |
exists:table,column | Поле должно существовать в заданной таблице базы данных |
file | Успешно загруженный файл |
filled | Поле содержит значение |
image | Файл изображения JPEG, PNG, BMP, GIF или SVG |
in:food,cheese,... | Значение должно быть одним из перечисленных (food, cheese и т.д.). |
in_array:anotherfield | Значение в поле должно быть одним из значений поля anotherfield |
integer | Целочисленное значение |
ip | IP-адрес |
json | JSON-строка |
max:value | Значение меньше или равно value |
mimetypes:text/plain,… | Файл должен быть одного из перечисленных MIME-типов 'mimetypes:video/avi,video/mpeg,video/quicktime' |
mimes:foo,bar,... | MIME-тип загруженного файла должен быть одним из перечисленных |
min:value | Значение более или равно value |
nullable | Равно null |
not_in:food,cheese,... | Значение не должно быть одним из перечисленных (food,cheese и т.д.). |
numeric | Числовое или дробное значение |
present | Поле есть в данных ввода, но может быть пустым |
regex:pattern | Соответствует регулярному выражению |
required | Непустое значение. Поле считается «пустым», если его значение это:
|
required_if:anotherfield,value,... | Непустое значение и другое поле anotherfield имеет любое значение value |
required_unless:anotherfield,value,... | Непустое значение и другое поле anotherfield не имеет значение value |
required_with:food,cheese,... | Непустое значение и присутствует любое из перечисленных полей (food,cheese и т.д.). |
required_with_all:food,cheese,... | Непустое значение и присутствуют все перечисленные поля (food,cheese и т.д.). |
required_without:food,cheese,... | Непустое значение и не присутствует любое из перечисленных полей (food,cheese и т.д.). |
required_without_all:food,cheese,... | Непустое значение и не присутствуют все перечисленные поля (food,cheese и т.д.). |
same:field | Значение совпадает с field |
size:value | Совпадает с value размер. Для строк это обозначает длину, для чисел — число, для массивов — число элементов массива, для файлов — размер в килобайтах. |
string | Является строкой |
timezone | Идентификатор временной зоны в соответствии с PHP-функцией timezone_identifiers_list |
url | Содержит URL |
unique:table,column,except,idColumn | Уникальное в заданной таблице базы данных. Если column не указано, то будет использовано имя поля. Пример: 'email' => 'unique:users,email'
Если требуется указать другое соединение с базой данных, то используйте точку: 'email' => 'unique:connection.users,email'
|