如何使用InputFilterManager在Zf2中构造自定义InputFilters

edi*_*igu 9 php zend-framework2

ZF2文档说明了defult服务文档 ;

InputFilterManager,映射到Zend\Mvc\Service\InputFilterManagerFactory.这将创建并返回Zend\InputFilter\InputFilterPluginManager的实例,该实例可用于管理和保留输入过滤器实例.

我有一个自定义zf2 inputfilter类,我在init()方法中添加过滤器和验证器,如下所示;

namespace Application\Filter;
use Zend\InputFilter\InputFilter;

class GlassFilter extends InputFilter
{
    public function init()
    {
        $this->add(array(
                'name' => 'glassname',
                'required' => true,
                'filters' => array(
                    array('name' => 'StringToUpper'),
                ),
                'validators' => array(
                    array( 'name' => 'StringLength', 'options' => array('min' => 3),
                ),
        ));
}
Run Code Online (Sandbox Code Playgroud)

我还在我的module.config.php中添加了以下键

'filters' => array(
    'invokables' => array(
        'glassfilter' => '\Application\Filter\GlassFilter',
    ),
),
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何使用InputFilterManager构建我的GlassFilter?这是正确的方法吗?我找到了这个线程,但我想了解自定义InputFilters和InputFilterManager之间的关系.

edi*_*igu 30

好吧,花了3个小时后(感谢令人难以置信的(!)文档)我想通了.我正在编写我的解决方案作为答案,希望它能帮助那些想要编写自定义输入过滤器的人.

  1. 您应该module.config.php通过input_filters top键注册自定义inputfilter ,而不是filter,filters,filter_manger,filtermanager等.
  2. Zend\InputFilter\InputFilter在编写自己的时候扩展默认值GlassFilter.
  3. 在你的init()方法中写下你的过滤器GlassFilter,而不是在__constructor().它将在施工后自动调用.
  4. 然后通过inputfiltermanager而不是servicemanager直接获取它.

配置示例:

'input_filters' => array(
    'invokables' => array(
        'glassfilter' => '\Application\Filter\GlassFilter',
     ),
),
Run Code Online (Sandbox Code Playgroud)

用法示例:

$glassfilter = $serviceLocator->get('InputFilterManager')->get('glassfilter');
Run Code Online (Sandbox Code Playgroud)

  • +1谢谢你的号码`4`!对于`1`,您也可以使用`Module.php`中的`Zend\ModuleManager\Feature\FilterProviderInterface` /`getFilterConfig()`. (2认同)