Проверка данных
Проверка данных (валидация) отвечает на вопрос, можно ли сохранять то, что прислал посетитель: заполнен ли заголовок, похожа ли почта на почту. В CodeIgniter условия записывают строкой правил для каждого поля. Правила пишут в методе контроллера, а общие наборы — в файле app/Config/Validation.php.
Первая проверка
Метод контроллера validateData() проверяет любой массив:
// app/Controllers/Posts.php
public function check(): string
{
$data = ['title' => 'PHP'];
$rules = ['title' => 'required|min_length[5]'];
if ($this->validateData($data, $rules)) {
return 'Данные верны';
}
return implode(', ', $this->validator->getErrors());
}Добавьте маршрут $routes->get('check', 'Posts::check'); и откройте /check. Заголовок короче пяти знаков, поэтому страница покажет сообщение об ошибке поля title. Правила разделяют вертикальной чертой и проверяют слева направо.
Проверка запроса
Данные формы проверяет метод validate() — он сам берёт их из запроса:
public function create()
{
$rules = [
'title' => 'required|min_length[5]|max_length[255]',
'body' => 'required',
];
if (! $this->validate($rules)) {
return redirect()->back()->withInput();
}
model(PostModel::class)->insert($this->validator->getValidated());
return redirect()->to('/posts');
}Если данные не прошли проверку, посетитель возвращается к форме, а withInput() сохраняет введённые значения и ошибки для следующей страницы. getValidated() возвращает только те поля, для которых описаны правила. Форму и вывод ошибок разбирает следующий урок.
Частые правила
| Правило | Что проверяет |
|---|---|
required | Поле заполнено |
min_length[5], max_length[255] | Длина строки |
valid_email | Адрес почты |
integer, numeric | Число |
greater_than[0], less_than[100] | Границы числа |
in_list[draft,published] | Одно из значений |
matches[password] | Совпадение с другим полем |
is_unique[users.email] | Значения ещё нет в таблице |
permit_empty | Поле может быть пустым |
Свои сообщения
Стандартные сообщения написаны по-английски и содержат имя поля. Свою подпись и текст задают так:
$rules = [
'title' => [
'label' => 'Заголовок',
'rules' => 'required|min_length[5]',
'errors' => [
'required' => 'Введите заголовок.',
'min_length' => 'Заголовок должен быть не короче 5 знаков.',
],
],
];Ключи массива errors — названия правил. Теперь при пустом поле посетитель увидит «Введите заголовок.».
Наборы правил
Правила, нужные в нескольких местах, записывают один раз в app/Config/Validation.php как свойство класса:
// app/Config/Validation.php
public array $post = [
'title' => 'required|min_length[5]|max_length[255]',
'body' => 'required',
];В контроллере набор вызывают по имени свойства: $this->validate('post').
Правила в модели
Правила можно записать и в модели — в свойстве $validationRules. Тогда они применяются при каждом insert(), update() и save(); при ошибке метод возвращает false, а сообщения отдаёт $model->errors().
Частая ошибка
Нельзя сохранять $this->request->getPost() целиком: в запросе могут оказаться поля, которых не было в форме. Берите данные из $this->validator->getValidated() — там только то, что описано в правилах и прошло проверку.