在servicemanager config zend框架内设置自定义过滤器插件

时间:2017-04-30 04:30:43

标签: php zend-framework filter zend-framework2 zend-framework3

我的应用程序用户表单中有以下代码,用于为ContractID = '2015/023'创建输入过滤器。

JOIN

如您所见,我将类名设置为过滤器的名称。

我收到以下错误:

ContractID

如何将此过滤器加入address2 element

注意

我想使用配置设置它,而不是在模块类中执行调用,所以我可以说 $inputFilter = new InputFilter(); $inputFilter->add([ 'name' => 'address2', 'required' => true, 'filters' => [ ['name'=>'StringTrim'], ['name'=>'Administration\Filter\Ucwords'] ] ]); 而不是过滤器配置中的完整类名。

2 个答案:

答案 0 :(得分:1)

配置对我来说是正确的。这里唯一的问题是您在指定过滤器名称(Administration\Filter\Ucwords)时发生了拼写错误。确保这样的类存在并且可以自动加载。

我还强烈建议您指定类常量(对于完全限定的类名解析)而不是字符串,例如

...
['name' => Administration\Filter\Ucwords::class]
...

答案 1 :(得分:0)

对于ZF3

假设您的Ucwords过滤器正在实施Zend\Filter\FilterInterface。然后,您可以在应用中的特定位置提供自定义过滤器,方法是将其添加到FilterPluginManagerFilterChain。如果FilterChain必须知道您附加到FilterPluginManager的任何过滤器。这是要牢记的要点。

N.B。但是您可以创建工厂而不是闭包。

方法1

将以下代码放入module.config.php

'service_manager' => [
    'factories' => [
        CustomFilter::class => function($sm){         
            $filterChain = new \Zend\Filter\FilterChain;
            $filterChain->getPluginManager()
                        ->setInvokableClass('Ucwords', \Administration\Filter\Ucwords::class);
            return new CustomFilter($filterChain);
        },
    ],
    'aliases' => [
        'CustomFilter' => CustomFilter::class,
    ],
],

方法2

确保通过位于应用程序配置目录中的 Zend\Filter 启用modules.config.php

现在将以下代码放入模块的module.config.php

'service_manager' => [
    'factories' => [
        CustomFilter::class => function($sm){
            $filterPluginManager = $sm->get('FilterManager');
            $filterChain = new \Zend\Filter\FilterChain();
            $filterChain->setPluginManager($filterPluginManager);

            return new CustomFilter($filterChain);
        },
    ],
    'aliases' => [
        'CustomFilter' => CustomFilter::class,
    ],
],
'filters' => [
    'factories' => [
        Ucwords::class => InvokableFactory::class           
    ],
    'aliases' => [
        'Ucwords' => Ucwords::class,
    ],
], 

<强>实施

现在创建Zend\InputFilter\Factory的实例(别名 InputFactory )。使用上一代码中的闭包设置您创建并通过 CustomFilter 的构造函数传递的 FilterChain 对象。然后根据需要使用Zend\InputFilter\Factory createInput()方法创建输入。将自定义 Ucwords 过滤器分配到您需要的位置(在这种情况下,我将其添加到标题)。请参阅以下代码。

<?php
use Zend\Filter\FilterChain;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;

class CustomFilter extends InputFilter
{
    protected $filterChain;    

    public function __construct(FilterChain $filterChain)
    { 

        $this->filterChain = $filterChain;

        // Set the FilterChain object
        $factory = new InputFactory();
        $factory->setDefaultFilterChain($this->filterChain);

        $this->add($factory->createInput(array(
            'name' => 'title',
            'required' => true,
            'filters' => array(
                array(
                    // Here we go
                    'name' => 'Ucwords',
                ),  
            ),
        )));

        ...
    }
}