0

我的 Zend Framework 2 应用程序中有一个通用模块,其中包含一些过滤器。

对于我的实体,我创建了一个带有InputFilterAwareInterface的过滤器类:

public function getInputFilter()
{
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();
        $factory     = new InputFactory();
        $inputFilter->add(
            $factory->createInput(
                array(
                    'name'     => 'desc',
                    'required' => false,
                    'filters'  => array(
                        array('name' => 'myfilter'),
                    ),
                )
            )
        );

        $this->inputFilter = $inputFilter;
    }
    return $this->inputFilter;
}

为了加载myfilter ,我使用FilterProviderInterface实现了 Generic 的 Module.php :

public function getFilterConfig()
{
    // Breakpoint at next line
    return array(
        'factories' => array(
            'myfilter' => function($sl) {
                $myfilter = $sl->getServiceLocator()->get('myfilterfactory');
                return new Filter\Filter\MyFilter($myfilter);
            },
        ),
    );
}

当我运行应用程序时,会引发异常:

Zend\ServiceManager\Exception\ServiceNotFoundException
Zend\Filter\FilterPluginManager::get was unable to fetch or create an instance for myfilter

我运行调试器并意识到从未调用过getFilterConfig()方法,因为没有触发断点。

我需要在我的代码中插入什么来加载过滤器配置?

编辑:

代码已执行,但调试器不会在断点处停止。当我插入一条附加语句并将断点设置为此时,执行停止。

在控制器中,我执行以下操作

$serviceManager = $this->getServiceLocator();
$filterManager = $serviceManager->get('FilterManager');

在过滤器管理器中,我在工厂数组中有myfilter 。但我仍然得到例外。

Zend\InputFilter\Factory(作为 InputFactory)如何知道过滤器工厂?

4

2 回答 2

1

最后我弄清楚出了什么问题以及如何解决这个问题:

在我用作 InputFactory 的 Zend\InputFilter\Factory 中,从头开始创建了一个defaultFilterChain ,它生成了一个新的FilterPluginManager,它没有获取服务管理器的过滤器。

为了解决这个问题,我将实体过滤器的工厂插入到服务管理器中,该工厂使用服务管理器的过滤器注入defaultFilterChain

'EntityFilter' => function($sm) {
    $filterManager = $sm->get('FilterManager');            
    $filterChain = new FilterChain;
    $filterChain->setPluginManager($filterManager);
    return new EntityFilter($filterChain);
 }

在过滤器类EntityFilter的getInputFilter方法中,它被插入到InputFactory 中

$factory = new InputFactory();
$factory->setDefaultFilterChain($this->defaultFilterChain);

现在InputFactory也可以使用服务管理器的过滤器管理器的这些过滤器,包括myfilter

于 2013-08-18T11:50:36.030 回答
0

问题肯定在您的呼吁范围内$sl->....->get('myfilterfactory')

尝试die("foo");在调用之前使用,你会看到它die()被执行了。然后你的代码似乎有点不干净,或者你不知道如何做得更好。

您正在使用工厂,那么为什么不使用真正的工厂呢?

'factories' => array(
    'myfilter' => 'YourNamespace\Filter\MyFilterFactory'
)

class MyFilterFactory implements FactoryInterface 
    public function createService($sl)
        $filterClass = new MyFilter();
        $filterClass->setDependency(
            $sl->getServiceLocator()->get('someDependency')
        )
        return $filterClass
于 2013-08-16T06:51:49.133 回答