Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Проверка данных

Проверка данных (валидация) отвечает на вопрос, можно ли сохранять то, что прислал посетитель: заполнен ли заголовок, похожа ли почта на почту. В 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() — там только то, что описано в правилах и прошло проверку.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.