Содержание


Цепочки фильтров


Filter Chains, фильтры, ЗФ2, Zend Framework 2, ZF2, ру, ru



Часто несколько фильтров нужно применить к некоторому значению в определенном порядке. Например, форма авторизации принимает имя пользователя, которое должно состоять только из символов алфавита, исключительно в нижнем регистре. Zend\Filter\FilterChain предоставляет простой метод, с помощью которого фильтры могут быть объединены в цепочку. Следующий код иллюстрирует, как объединить в цепочку два фильтра, чтобы обработать предоставленное имя пользователя:


 // Создать цепочку фильтров и добавить фильтр в цепочку
$filterChain = new Zend\Filter\FilterChain();
$filterChain->attach(new Zend\Filter\Alpha())
                  ->attach(new Zend\Filter\StringToLower());
 // Фильтрация имени пользователя
$username = $filterChain->filter($_POST['username']);
 

Фильтры выполняются в том порядке, в котором они добавлены в Zend\Filter\FilterChain. В приведенном выше примере из имени пользователя сначала удаляются любые неалфавитные символы, а затем любые символы верхнего регистра переводятся в нижний регистр.

 

Любой объект, реализующий интерфейс Zend\Filter\FilterInterface, может быть использован в цепочке фильтров.

 

Настройка последовательности фильтров в цепочке

 

Для каждого фильтра, добавленного в FilterChain, вы можете установить приоритет, чтобы задать порядок следования в цепочке. Значение по умолчанию - 1000. В следующем примере любые символы верхнего регистра преобразуются в нижний регистр до того, как будут удалены любые неалфавитные символы.

 // Создать цепочку фильтров и добавить фильтр в цепочку
$filterChain = new Zend\Filter\FilterChain();
$filterChain->attach(new Zend\Filter\Alpha())
                  ->attach(new Zend\Filter\StringToLower(), 500);
 


Использование менеджера плагинов

 

Каждый объект FilterChain содержит экземпляр менеджера плагинов фильтров, FilterPluginManager. Каждый фильтр, использующийся в FilterChain, должен быть известен этому FilterPluginManager. Чтобы добавить фильтр, который известен менеджеру плагинов фильтров, используйте метод attachByName() . Первым аргументом метода является имя фильтра в FilterPluginManager. В качестве второго аргумента могут выступать любые параметры, необходимые для создания экземпляра фильтра. Третьим аргументом является приоритет фильтра.

 // Создать цепочку фильтров и добавить фильтр в цепочку
$filterChain = new Zend\Filter\FilterChain();
$filterChain->attachByName('alpha')
                  ->attachByName('stringtolower', array('encoding' => 'utf-8'), 500);
 

В следующем примере показано, как добавить пользовательский фильтр в FilterPluginManager и FilterChain.

$filterChain = new Zend\Filter\FilterChain();
$filterChain->getPluginManager()->setInvokableClass(
     'myNewFilter', 'MyCustom\Filter\MyNewFilter'
);
$filterChain->attach(new Zend\Filter\Alpha())
                  ->attach(new MyCustom\Filter\MyNewFilter());
 

Вы также можете добавить собственные реализации FilterPluginManager.

 $filterChain = new Zend\Filter\FilterChain();
$filterChain->setPluginManager(new MyFilterPluginManager());
$filterChain->attach(new Zend\Filter\Alpha())
                  ->attach(new MyCustom\Filter\MyNewFilter());