在Zend Framework 2 Module.php中,从不调用getFilterConfig()方法

时间:2013-08-15 17:11:53

标签: zend-framework2 zend-framework-modules zend-filter

我的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)如何了解过滤器工厂?

2 个答案:

答案 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