Skip to content
Anton edited this page Jun 5, 2014 · 25 revisions

Описание

с версии 0.4.0

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

Настройки

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

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

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

use \Bluz\Validator\Validator as v;

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

if (!v::string()->validate(123)) {
    echo "String is required";
}

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

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());
}

Clone this wiki locally