0

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をロードするために、Generic の Module.php に FilterProviderInterface を実装しまし

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 内で、サービス マネージャーのフィルターを取得しない新しいFilterPluginManagerを生成するdefaultFilterChainがゼロから作成されます。

これを解決するために、エンティティ フィルターのファクトリをサービス マネージャーに挿入し、サービス マネージャーのフィルターを使用して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 に答える