我的Zend Framework 2应用程序中有一个Generic模块,里面有一些过滤器。
对于我的实体,我使用 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)如何了解过滤器工厂?
答案 0 :(得分:1)
最后我弄清楚出了什么问题以及如何解决这个问题:
在我用作InputFactory的Zend \ InputFilter \ Factory中,从头开始创建 defaultFilterChain ,生成一个新的 FilterPluginManager ,它不会获得服务管理器的过滤器。< / p>
要解决此问题,我将实体过滤器的工厂插入到服务管理器中,该服务管理器使用服务管理器的过滤器注入 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 。
答案 1 :(得分: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