не удается найти подключаемый модуль фильтра службы Zend Framework

У меня есть следующая конфигурация для моих фильтров. это используется для настройки диспетчера служб Zend Framework.

$filters = [
  'factories' => ['Administration\Filter\StripSpaces'=>'Zend\ServiceManager\Factory\InvokableFactory']
  'aliases'   => ['StripSpaces'=>'Administration\Filter\StripSpaces']
];
return ['filters'=>$filters];

Для использования формы

$inputFilter->add([
    'name'     => 'objectclassname',
    'required' => true,
    'filters'  => [
            ['name' => 'StringTrim'],
            ['name' => 'StripTags'],
            ['name' => 'StripNewlines'],
            ['name' => 'StripSpaces'] // here is where my StripSpaces alias is used
    ],
    'validators' => [                       
            [
             'name'    => 'StringLength',
             'options' => [
                'min' => 5,
                'max' => 255
              ],
         ]
     ],
]);

А вот ошибка при загрузке формы, использующей этот фильтр:

A plugin by the name "StripSpaces" was not found in the plugin manager Zend\Filter\FilterPluginManager

person somejkuser    schedule 16.10.2017    source источник
comment
См. stackoverflow.com/questions/43702914/   -  person Alain Pomirol    schedule 16.10.2017
comment
@AlainPomirol Почему я не могу просто добавить его в диспетчер служб и добавить псевдоним вместо того, чтобы выполнять всю эту работу? они хотят, чтобы я добавил пользовательский фильтр, и у них одинаковые конфигурации   -  person somejkuser    schedule 16.10.2017
comment
объяснение вы найдете в документации по адресу docs. zendframework.com/zend-filter/filter-chains/. FilterPluginManager прикрепляется к каждому экземпляру FilterChain. Каждый фильтр, который используется в FilterChain, должен быть известен менеджеру плагинов фильтра.   -  person Alain Pomirol    schedule 17.10.2017


Ответы (2)


Насколько я знаю, в ZF3 нет фильтра StripSpaces.

person FranMercaes    schedule 16.10.2017
comment
Я знаю, что это фильтр, который я написал, я не могу заставить его работать, делая то, что я сделал - person somejkuser; 16.10.2017

Если вы хотите иметь настраиваемые фильтры/валидаторы в вашем InputFilter, вы должны получить класс InputFilter из вашего InputFilterManager, как показано ниже:

$serviceManager->get('InputFilterManager')->get(MyInputFilter::class);

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

Почему мне нужно получить мой входной фильтр от менеджера? В связи с тем, что при создании нового объекта, как в new MyInputFilter(), InputFilter\Factory создается новый экземпляр класса InputFilterManager. Это не приложения InputFilterManager, которые содержат вашу конфигурацию, а только фильтры/валидаторы Zend по умолчанию. Это удобно, если у вас нет настраиваемых фильтров или валидаторов, которые вы хотите использовать.

Когда вы используете приложения InputFilterManager для получения входного фильтра, он обновляет фабрику, предоставляя приложения InputFilterManager, которые содержат ссылку на приложения ServiceManager. И из вашего приложения ServiceManager оно извлекает другие менеджеры для ваших фильтров и валидаторов и обновляет цепочки фабрики InputFilter. Таким образом, InputFilter знает о ваших пользовательских фильтрах/валидаторах.

Обратите внимание, что вам следует обновить способ настройки входных фильтров. Не устанавливайте свои фильтры/валидаторы в __construct(), поскольку цепочки еще не обновлены и, следовательно, не содержат ваших пользовательских фильтров/валидаторов. Переместите конфигурацию входного фильтра в public function init(), который вызывается из InputFilterManager, который инициализирует ваш класс InputFilter.

person Kwido    schedule 19.10.2017