Содержание


InputFilter (Фильтры)


InputFilter, ЗФ2, Zend Framework 2, ZF2, ру, ru


    /div


Компонент Zend\InputFilter может быть использован для фильтрации и проверки на валидность входных данных. Например, Вы можете использовать его для фильтрации значений в $_GET и $_POST, аргументы CLI  и т.д.

 

Для передачи данных в InputFilter используется метод «setData()».  Данные должны быть сформированы в ассоциативный массив.

 

Пример: проверка данных на валидность, пришедших из формы через метод POST:

use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Input;
use Zend\Validator;
 
$email = new Input('email');
$email->getValidatorChain()
      ->addValidator(new Validator\EmailAddress());
 
$password = new Input('password');
$password->getValidatorChain()
         ->addValidator(new Validator\StringLength(8));
 
$inputFilter = new InputFilter();
$inputFilter->add($email)
            ->add($password)
            ->setData($_POST);
 
if ($inputFilter->isValid()) {
    echo "The form is validn";
} else {
    echo "The form is not validn";
    foreach ($inputFilter->getInvalidInput() as $error) {
        print_r ($error->getMessages());
    }
}

В этом примере проверялись значения «email» (электронная почта) и «password» (пароль).  Почта должна содержать валидный адрес электронного почтового ящика  (xxxxx@xxx.xx), а пароль должен быть как минимум длинной в 8 символов. Если же данные не удовлетворяют заданным условиям валидности, то выводим список допущенных ошибок, используя метод «getInvalidInput()».

 

При необходимости Вы можете добавить один или несколько валидаторов, используя метод «addValidator()» для каждого из валидаторов.  Так же существует возможность создавать «группы валидаторов (validation group)», достигается путем вызова метода «setValidationGroup()».  Вы можете добавлять имена валидаторов или фильтров передавая их как параметры в метод, или как массив.

// As individual parameters
$filterInput->setValidationGroup('email', 'password');
 
// or as an array of names
$filterInput->setValidationGroup(array('email', 'password'));

Вы можете проверять на валидность и/или добавлять фильтры, используя InputFilter. Для фильтрации данных используйте метод «getFilterChain()» в индивидуальных случаях, и прикрепляйте фильтры к возвращаемой цепочке фильтров.

 

Пример: использование фильтров без валидации:

use Zend\InputFilter\Input;
use Zend\InputFilter\InputFilter;
 
$input = new Input('foo');
$input->getFilterChain()
      ->attachByName('stringtrim')
      ->attachByName('alpha');
 
$inputFilter = new InputFilter();
$inputFilter->add($input)
            ->setData(array(
                'foo' => ' Bar3 ',
            ));
 
echo "Before:n";
echo $inputFilter->getRawValue('foo') . "n"; // the output is ' Bar3 '
echo "After:n";
echo $inputFilter->getValue('foo') . "n"; // the output is 'Bar'

Метод «getValue()» возвращает отфильтрованные данные, поступившие на вход , с именем «foo», в метод «getRawValue()» - возвращает оригинальные (не тронутые) данные.

 

Так же предусмотрена фабрика Zend\InputFilter\Factory, позволяющая инициализировать InputFilter, основываясь на массиве настроек или объекте Traversable.

 

Пример: Создаем фильтр «password», с теми же ограничениями, что и в предыдущем примере (минимум 8 символов):

use Zend\InputFilter\Factory;
 
$factory = new Factory();
$inputFilter = $factory->createInputFilter(array(
    'password' => array(
        'name'       => 'password',
        'required'   => true,
        'validators' => array(
            array(
                'name' => 'not_empty',
            ),
            array(
                'name' => 'string_length',
                'options' => array(
                    'min' => 8
                ),
            ),
        ),
    ),
));
 
$inputFilter->setData($_POST);
echo $inputFilter->isValid() ? "Valid form" : "Invalid form";

Фабрика позволяет создавать не только экземпляры Input, но и вложенные InputFilters, что дает возможность создавать валидаторы и фильтры для иерархических наборов данных.

 

Реализация InputFilter по умолчанию использует фабрику. Тоесть, при использовании метода «add()», Вы должны предоставить спецификации, понятные для фабрики, а она в свою очередь создаст необходимый объект. Есть возможность создавать объекты обоих типов: Input и InputFilter.

use Zend\InputFilter\InputFilter;
 
$filter = new InputFilter();
 
// Adding a single input
$filter->add(array(
    'name' => 'username',
    'required' => true,
    'validators' => array(
        array(
            'name' => 'not_empty',
        ),
        array(
            'name' => 'string_length',
            'options' => array(
                'min' => 5
            ),
        ),
    ),
));
 
// Adding another input filter what also contains a single input. Merging both.
$filter->add(array(
    'type' => 'ZendInputFilterInputFilter',
    'password' => array(
        'name' => 'password',
        'required' => true,
        'validators' => array(
            array(
                'name' => 'not_empty',
            ),
            array(
                'name' => 'string_length',
                'options' => array(
                    'min' => 8
                ),
            ),
        ),
    ),
));

Автор статьи: DuB