Skip to content
AntonShevchuk edited this page Sep 23, 2014 · 25 revisions

Описание

с версии 0.4.0

с версии 0.5.0 добавлена поддержка метода arrayInput($callback)

Пакет Validator предназначен для проверки входных данных. Пакет разработан с использование исходного кода проекта https://github.com/Respect/Validation, к сожалению, не получилось адаптировать данный пакет для использования его AS IS.

Настройки

Глобальных настроек нет

Использование

Для сокращения объёма кода рекомендуется следующая запись для подключения класса Validator:

use \Bluz\Validator\Validator as v;

Простой пример использования валидатора:

if (!v::string()->validate(123)) {
    echo "It must be a string";
}

Используя исключения:

try {
    v::string()->assert(123);
} catch (\InvalidArgumentException $e) {
    echo $e->getMessage();
}

Цепочка правил

if (!v::string()->length(5, 10)->validate('foo bar')) {
    echo "String must have a length between 5 and 10";
}

Повторное использование

$validator = v::string()->length(25, 40);

if (!$validator->validate('foo bar')) {
    echo "String must have a length between 25 and 40\n";
}

if (!$validator->validate('baz qux')) {
    echo "String must have a length between 25 and 40\n";
}

Альтернативный вариант с использованием __invoke():

$numberValidator = v::integer()->min(25)->max(40);

if (!$numberValidator(5)) {
    echo "Number should be integer between 25 and 40\n";
}

if (!$numberValidator(42)) {
    echo "Number should be integer between 25 and 40\n";
}

Текст ошибок и правила проверки

Получение правил для проверки:

$validator = v::string()->length(25, 40)->setName('description');

echo $validator;

// "description" must be a string
// "description" must have a length between 25 and 40

Получение текста ошибки:

$validator = v::string()->length(25, 40);

if (!$validator->validate('foo bar')) {
    echo $validator->getError();
}

Установка произвольного текста ошибки:

$validator = v::regexp('/[a-z]/')
    ->regexp('/[A-Z]/')
    ->regexp('/[0-9]/')
    ->setError('Password must contain lowercase and uppercase letter, numbers and non-alfanumeric symbols')

echo $validator;
// Password must contain lowercase and uppercase letter, numbers and non-alfanumeric symbols

if (!$validator->validate('123456')) {
    echo $validator->getError();
}

В тексте ошибки можно использовать ключевые слова {{name}} и {{input}}, которые при выводе будут заменены на имя проверяемого и текущие входные данные соответственно:

$validator = v::regexp('/[a-z]/')
    ->regexp('/[A-Z]/')
    ->regexp('/[0-9]/')
    ->setName('Password')
    ->setError('{{name}} must contain lowercase and uppercase letter, numbers and non-alfanumeric symbols, but "{{input}}" received');

Проверка массива или объекта

Для проверки объекта либо ассоциативного массива следует использовать ValidatorBuilder:

$validator = new ValidatorBuilder();

// title validator
$validator->add(
    'title',
    v::required()->string()->notEmpty()
);

// alias validator
$validator->add(
    'alias',
    v::required()->string()->notEmpty(),
    v::regexp('/^[a-zA-Z0-9_\.\-]+$/i')
        ->setError('Alias should contains only Latin characters, dots and dashes'),
    v::callback(function($input) use ($data) {
            if ($row = $this->getTable()->findRowWhere(['alias' => $input])) {
                if ($row->id != $data['id']) {
                    return false;
                }
            }
            return true;
        })->setError('Alias "{{input}}" already exists')
);

if (!$validator->validate($data)) {
    $this->setErrors($validator->getErrors());
}

Список доступных правил

  • alpha($additionalCharacters = '') - проверка на буквы алфавита, внутри используется ctype_alpha, с соответствующей зависимостью от установленной локали для LC_CTYPE, разрешает пробельные символы
  • alphaNumeric($additionalCharacters = '') - проверка на буквы алфавита и цифры, внутри используется ctype_alnum, разрешает пробельные символы
  • arrayInput($callback) - проверка массива любой callable структурой (это может быть как встроенная функция, так и другое правило из данного пакета)
  • between($min, $max, $inclusive = false) - проверка на вхождение в диапазон
  • callback($callback) - проверка с использованием функции обратного вызова, поддерживается все callable структуры
  • condition($condition) - для проверки используется произвольное условие
  • contains($containsValue, $identical = false) - содержит заданный элемент
  • countryCode() - проверка на ISO 3166-1 alpha-2
  • creditCard() - проверка номера кредитной карточки алгоритмом Луна
  • date($format) - проверка даты на соответствие заданному формату
  • domain($checkDns = false) - проверка доменного имени
  • email($checkDns = false) - проверка email
  • equals($compareTo, $identical = false) - сравнение с заданным значением
  • float() - число с плавающей запятой
  • in($haystack, $identical = false) - вхождение в заданный массив данных - массив или строку
  • integer() - целое число
  • ip($options = null) - проверка IP адреса, можно задать диапазон для проверки
  • json() - строка с JSON
  • latin($additionalCharacters = '') - проверка на буквы латинского алфавита, запрещает пробельные символы
  • latinNumeric($additionalCharacters = '') - проверка на буквы латинского алфавита и цифры, запрещает пробельные символы
  • length($min = null, $max = null, $inclusive = true) - проверка длины строки или массива
  • max($maxValue, $inclusive = false) - проверка максимального значения
  • min($minValue, $inclusive = false) - проверка минимального значения
  • notEmpty() - не пустое значение, обёртка над empty()
  • noWhitespace() - без пробелов
  • numeric() - число
  • required() - обязательное поле, отсеивает по isset(), и сравнению с null, false и пустой строкой
  • regexp($expression) - проверка по регулярному выражению
  • string() - строка

Clone this wiki locally