Проверка принимаемых данных в Laravel

Фильтрация данных, получаемых от пользователей, это основа безопасности всех систем. В Laravel есть набор методов для валидации HTTP запросов с помощью различных правил.

Пример фильтрации данных

Попробуем сделать пример приложения-блога. В нём будет форма для создания новой публикации. Предположим, что у такого приложения есть несколько маршрутов:
<?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Латинские символы, цифры, знаки подчёркивания (_) и дефисы (-).
arrayPHP-массив
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Массив не должен содержать дублирующих значений
emailКорректный адрес e-mail
exists:table,columnПоле должно существовать в заданной таблице базы данных
fileУспешно загруженный файл
filledПоле содержит значение
imageФайл изображения JPEG, PNG, BMP, GIF или SVG
in:food,cheese,...Значение должно быть одним из перечисленных (food, cheese и т.д.).
in_array:anotherfieldЗначение в поле должно быть одним из значений поля anotherfield
integerЦелочисленное значение
ipIP-адрес
jsonJSON-строка
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Непустое значение. Поле считается «пустым», если его значение это:
  • NULL
  • пустая строка
  • пустой массив или пустой Countable-объект
  • файл для загрузки без пути
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'
Читайте продолжение статьи тут: "Проверка принимаемых данных в Laravel (часть 2)"
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, курсы создания сайтов, вебинары по созданию, курсы разработки сайтов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Cмотрите другие статьи:
Была ли статья полезной?
Была ли эта статья полезна? Есть вопрос?
хостинг для сайтов
Закажите недорогой хостинг Заказать

всего от 290 руб