Spec-Zone.ru › Phalcon 2

Валидация

Phalcon\Validation — это независимый компонент валидации, который проверяет произвольный набор данных. Этот компонент можно использовать для реализации правил валидации для объектов данных, которые не относятся к модели или коллекции.

Следующий пример демонстрирует его базовое использование:

use Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Email;

$validation = new Phalcon\Validation();

$validation->add('name', new PresenceOf(array(
    'message' => 'The name is required'
)));

$validation->add('email', new PresenceOf(array(
    'message' => 'The e-mail is required'
)));

$validation->add('email', new Email(array(
    'message' => 'The e-mail is not valid'
)));

$messages = $validation->validate($_POST);
if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

Раздельный дизайн этого компонента позволяет создавать собственные валидаторы наряду с теми, которые предоставляются фреймворком.

Инициализация валидации

Цепочки валидации можно инициализировать прямым добавлением валидаторов в объект Phalcon\Validation. Вы можете поместить ваши валидации в отдельный файл для лучшего повторного использования кода и организации:

use Phalcon\Validation,
    Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Email;

class MyValidation extends Validation
{
    public function initialize()
    {
        $this->add('name', new PresenceOf(array(
            'message' => 'The name is required'
        )));

        $this->add('email', new PresenceOf(array(
            'message' => 'The e-mail is required'
        )));

        $this->add('email', new Email(array(
            'message' => 'The e-mail is not valid'
        )));
    }
}
$validation = new MyValidation();

$messages = $validation->validate($_POST);
if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

Валидаторы

Phalcon предоставляет набор встроенных валидаторов для этого компонента:

Название Описание Пример
PresenceOf Проверяет, что значение поля не является пустым или пустой строкой. Пример
Identical Проверяет, что значение поля совпадает с указанным значением. Пример
Email Проверяет, что поле содержит корректный формат электронной почты. Пример
ExclusionIn Проверяет, что значение не содержится в списке возможных значений. Пример
InclusionIn Проверяет, что значение содержится в списке возможных значений. Пример
Regex Проверяет, что значение поля соответствует регулярному выражению. Пример
StringLength Проверяет длину строки. Пример
Between Проверяет, что значение находится между двумя значениями. Пример
Confirmation Проверяет, что значение совпадает с другим значением, присутствующим в данных. Пример

Следующий пример поясняет, как создавать дополнительные валидаторы для этого компонента:

use Phalcon\Validation\Validator,
    Phalcon\Validation\ValidatorInterface,
    Phalcon\Validation\Message;

class IpValidator extends Validator implements ValidatorInterface
{

    /**
     * Executes the validation
     *
     * @param Phalcon\Validation $validator
     * @param string $attribute
     * @return boolean
     */
    public function validate($validator, $attribute)
    {
        $value = $validator->getValue($attribute);

        if (!filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) {

            $message = $this->getOption('message');
            if (!$message) {
                $message = 'The IP is not valid';
            }

            $validator->appendMessage(new Message($message, $attribute, 'Ip'));

            return false;
        }

        return true;
    }

}

Важно, чтобы валидаторы возвращали действительное булево значение, указывающее, была ли валидация успешной или нет.

Сообщения валидации

Phalcon\Validation имеет систему сообщений, которая предоставляет гибкий способ вывода или хранения сообщений о валидации, сгенерированных во время процесса валидации.

Каждое сообщение состоит из экземпляра класса Phalcon\Validation\Message. Набор сгенерированных сообщений можно получить с помощью метода getMessages(). Каждое сообщение предоставляет расширенную информацию, такую как атрибут, который сгенерировал сообщение, или тип сообщения:

$messages = $validation->validate();
if (count($messages)) {
    foreach ($validation->getMessages() as $message) {
        echo "Message: ", $message->getMessage(), "\n";
        echo "Field: ", $message->getField(), "\n";
        echo "Type: ", $message->getType(), "\n";
    }
}

Метод getMessages() можно переопределить в классе валидации, чтобы заменить/перевести стандартные сообщения, сгенерированные валидаторами:

class MyValidation extends Phalcon\Validation
{

    public function initialize()
    {
        // ...
    }

    public function getMessages()
    {
        $messages = array();
        foreach (parent::getMessages() as $message) {
            switch ($message->getType()) {
                case 'PresenceOf':
                    $messages[] = 'The field ' . $message->getField() . ' is mandatory';
                    break;
            }
        }
        return $messages;
    }
}

Или вы можете передать параметр «message», чтобы изменить стандартное сообщение в каждом валидаторе:

use Phalcon\Validation\Validator\Email;

$validation->add('email', new Email(array(
    'message' => 'The e-mail is not valid'
)));

По умолчанию «getMessages» возвращает все сообщения, сгенерированные во время валидации. Вы можете отфильтровать сообщения для конкретного поля с помощью метода «filter»:

$messages = $validation->validate();
if (count($messages)) {
    //Filter only the messages generated for the field 'name'
    foreach ($validation->getMessages()->filter('name') as $message) {
        echo $message;
    }
}

Фильтрация данных

Данные могут быть отфильтрованы перед валидацией, чтобы гарантировать, что вредоносные или некорректные данные не будут проверены.

$validation = new Phalcon\Validation();

$validation
    ->add('name', new PresenceOf(array(
        'message' => 'The name is required'
    )))
    ->add('email', new PresenceOf(array(
        'message' => 'The email is required'
    )));

//Filter any extra space
$validation->setFilters('name', 'trim');
$validation->setFilters('email', 'trim');

Фильтрация и очистка выполняются с помощью компонента filter. Вы можете добавить больше фильтров в этот компонент или использовать встроенные.

События валидации

Когда валидации организованы в классах, вы можете реализовать методы «beforeValidation» и «afterValidation», чтобы выполнить дополнительные проверки, фильтры, очистку и т. д. Если метод «beforeValidation» возвращает false, валидация автоматически отменяется:

use Phalcon\Validation;

class LoginValidation extends Validation
{

    public function initialize()
    {
        // ...
    }

    /**
     * Executed before validation
     *
     * @param array $data
     * @param object $entity
     * @param Phalcon\Validation\Message\Group $messages
     * @return bool
     */
    public function beforeValidation($data, $entity, $messages)
    {
        if ($this->request->getHttpHost() != 'admin.mydomain.com') {
            $messages->appendMessage(new Message('Only users can log on in the administration domain'));
            return false;
        }
        return true;
    }

    /**
     * Executed after validation
     *
     * @param array $data
     * @param object $entity
     * @param Phalcon\Validation\Message\Group $messages
     */
    public function afterValidation($data, $entity, $messages)
    {
        //... add additional messages or perform more validations
    }

}

Отмена валидации

По умолчанию все валидаторы, назначенные полю, тестируются независимо от того, потерпел ли один из них неудачу или нет. Вы можете изменить это поведение, указав компоненту валидации, какой валидатор может остановить валидацию:

use Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Regex;

$validation = new Phalcon\Validation();

$validation
    ->add('telephone', new PresenceOf(array(
        'message' => 'The telephone is required',
        'cancelOnFail' => true
    )))
    ->add('telephone', new Regex(array(
        'message' => 'The telephone is required',
        'pattern' => '/\+44 [0-9]+/'
    )))
    ->add('telephone', new StringLength(array(
        'minimumMessage' => 'The telephone is too short',
        'min' => 2
    )));

Первый валидатор имеет параметр «cancelOnFail» со значением true, поэтому, если этот валидатор терпит неудачу, оставшиеся валидаторы в цепочке не выполняются.

Если вы создаете пользовательские валидаторы, вы можете динамически остановить цепочку валидации, установив параметр «cancelOnFail»:

use Phalcon\Validation\Validator,
    Phalcon\Validation\ValidatorInterface,
    Phalcon\Validation\Message;

class MyValidator extends Validator implements ValidatorInterface
{

    /**
     * Executes the validation
     *
     * @param Phalcon\Validation $validator
     * @param string $attribute
     * @return boolean
     */
    public function validate($validator, $attribute)
    {
        // If the attribute value is name we must stop the chain
        if ($attribute == 'name') {
            $validator->setOption('cancelOnFail', true);
        }

        //...
    }

}

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/validation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API