如何将自定义输入过滤器添加到 Zend Framework 2


How to add a custom input filter to Zend Framework 2?

我正在使用Zend Framework 2,并且我创建了一个新的输入过滤器,它将在整个应用程序中使用。我知道我需要将新过滤器添加到 FilterPluginManager 的列表中,以便我可以在创建输入时调用它。这是我认为我需要使用的代码:

'Zend'Filter'FilterPluginManager::setInvokableClass('myFilter', 'Namespace'Filters'MyFilter');

但是,我找不到这应该去哪里。这应该在引导程序中,还是在配置文件之一中,还是在其他地方?

这是

你想要的答案

https://packages.zendframework.com/docs/latest/manual/en/modules/zend.service-manager.quick-start.html

class Module
{
public function getServiceConfig()
{
    return array(
        'invokables' => array(
           'UserInputFiler' => 'SomeModule'InputFilter'User',
        ),
    );
}
}

在你的Module中,实现InputFilterProviderInterface并为InputFilterPluginManager提供一个FactoryAbstractPluginManager):

namespace YourModule; 
use Zend'ModuleManager'Feature'InputFilterProviderInterface;
class Module implements InputFilterProviderInterface
{
    public function getInputFilterConfig()
    {
        return [
            'factories'=>[
                'your_input_filter_name'=>'YourModule'Factories'InputFilterFactory::class
            ]
        ];
    }
}

现在实现工厂:

namespace YourModule'Factories;
use Zend'Filter'StringTrim;
use Zend'InputFilter'Input;
use Zend'InputFilter'InputFilter;
use Zend'ServiceManager'FactoryInterface;
use Zend'ServiceManager'ServiceLocatorInterface;
use Zend'Validator'StringLength;
class InputFilterFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $filter = new InputFilter();
        $nameFilter = new Input("name");
        $nameFilter->getValidatorChain()->attach(new StringLength([
            'min'=>3,
            'max'=>16
        ]));
        $nameFilter->getFilterChain()->attach(new StringTrim());
        $filter->add($nameFilter);
        return $filter;
    }
}

现在,在您的Controller工厂或其他需要InputFilter的工厂中,您可以访问InputFilterPluginManager

$inputFilterManager = $controllerManager->getServiceLocator()->get('InputFilterManager');
return new YourController(
    $inputFilterManager->get('your_input_filter_name')
);

更新后,您还可以将工厂添加到模块.config中.php

    'input_filters'=>[
        'factories'=>[
            'your_input_filter_name'=>InputFilterFactory::class
        ]
    ],