Zend framework2 在Zend Framework 2 Module.php中,永远不会调用getFilterConfig()方法

Zend framework2 在Zend Framework 2 Module.php中,永远不会调用getFilterConfig()方法,zend-framework2,zend-framework-modules,zend-filter,Zend Framework2,Zend Framework Modules,Zend Filter,我的Zend Framework 2应用程序中有一个通用模块,其中包含一些过滤器 对于我的实体,我创建了一个带有InputFilterWareInterface的筛选器类: 要加载myfilter,我使用FilterProviderInterface实现了Generic的Module.php: 运行应用程序时会引发异常: Zend\ServiceManager\Exception\ServiceNotFoundException Zend\Filter\FilterPluginManager::

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

对于我的实体,我创建了一个带有InputFilterWareInterface的筛选器类:

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

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

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)是如何知道过滤器工厂的?

最确定的问题是在您调用
$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

最后我找出了问题所在以及解决方法:

在我用作InputFactory的Zend\InputFilter\Factory中,从零开始创建了一个defaultFilterChain,它生成了一个新的FilterPluginManager,该FilterPluginManager不获取服务管理器的筛选器

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

'EntityFilter' => function($sm) {
    $filterManager = $sm->get('FilterManager');            
    $filterChain = new FilterChain;
    $filterChain->setPluginManager($filterManager);
    return new EntityFilter($filterChain);
 }
在filter类EntityFilter的getInputFilter方法中,这被插入到InputFactory中:


现在,InputFactory还可以使用服务管理器的筛选器管理器的这些筛选器,其中包括myfilter。

您是否有类似于此公共函数getServiceConfig(){return array('invokables'=>array)的工厂('myfilterfactory'=>'Application\Filter\myfilterfactory',);}是的,我有,问题似乎是该方法没有执行,并且在方法中没有错误。我在模块中做了一个测试,它可以工作。尝试发布更多代码。Filter\Filter\MyFilter($MyFilter);是否有名为Filter的模块?您的代码不调用$mymodelentities->getInputFilter()我有一个通用模块,因为我需要更多模块中的过滤器。路径是Generic/src/filter/filter。双过滤器来自过滤器实现和工厂,应该位于单独的文件夹Generic/src/filter/Factory中。也许我应该清理这个。关于getInputFilter():之所以调用此函数,是因为在我的问题中,我只编写了与我的问题有关的部分代码。其中有其他正确执行的筛选器。我有一个与实体并行的单独筛选器类。但这适用于Zend Framework的筛选器。因此我认为这应该可行。我用die语句尝试了此函数,但应用程序没有已终止,但我仍然收到异常。是否确实加载了模块?^^您还可以在控制器或任何位置检查合并的配置,并对
$serviceLocator->get('config')进行调试
,只是想看看它是否真的在那里,你可以使用一个服务工厂来达到这个目的。这里的代码和说明:+1很好的一个,我遇到了同样的问题,尽管实现了
FilterProviderInterface
,但没有找到工厂。你刚刚为我节省了很多时间!
'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
'EntityFilter' => function($sm) {
    $filterManager = $sm->get('FilterManager');            
    $filterChain = new FilterChain;
    $filterChain->setPluginManager($filterManager);
    return new EntityFilter($filterChain);
 }
$factory = new InputFactory();
$factory->setDefaultFilterChain($this->defaultFilterChain);