2013-08-15 2 views
0

У меня есть общий модуль в моем приложении Zend Framework 2 с некоторыми фильтрами в нем.В Zend Framework 2 Module.php метод getFilterConfig() никогда не называется

Для моего лица, я создал класс фильтра с 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 Я реализовал 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() метод никогда не вызывается, потому что контрольная точка не срабатывает.

Что мне нужно вставить в мой код, чтобы загрузить конфигурацию фильтра?

EDIT:

код выполняется, но отладчик не останавливается на точке останова. Когда я вставляю дополнительный оператор и устанавливаю точку останова на это, выполнение останавливается.

В контроллере я сделать следующее

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

и в менеджере фильтра у меня MyFilter в заводов массива. Но все же я получаю исключение.

Как известно фабрика фильтров Zend \ InputFilter \ Factory (как InputFactory)?

+0

сделал у вас есть завод, как эта общественная функция getServiceConfig() { возвращение массива ( 'invokables' => массив ( 'myfilterfactory' => 'Application \ Filter \ MyFilterFactory', )); } – Whisher

+0

Да, проблема заключается в том, что метод не выполняется, а не ошибка в методе. – Matthias

+0

Я провел тест в своем модуле, и он работает. Постарайтесь отправить больше кода. – Whisher

ответ

1

Наконец-то я понял, что пошло не так, и как решить эту проблему:

В Zend \ InputFilter \ Factory, который я использовал в качестве InputFactory defaultFilterChain создается с нуля, который генерирует новый FilterPluginManager, который не получает фильтры сервис-менеджера.

Чтобы решить эту проблему я вставляю фабрику для фильтра объекта в сервис-менеджер, который впрыскивает defaultFilterChain с фильтрами менеджер службы:

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

В метода getInputFilter класса фильтра EntityFilter это вставляется в InputFactory:

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

Теперь InputFactory также может использовать эти фильтры менеджера фильтров менеджера сервиса, который включает в себя myfilter.

+0

Для этой цели вы можете использовать фабрику сервисов. Код и инструкции здесь: https://gist.github.com/Thinkscape/8418700 –

+0

+1 Приятный, у меня была такая же проблема, когда фабрика не была найдена, несмотря на внедрение 'FilterProviderInterface'. Ты просто спас мне массу времени! – AlexP

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 
+0

Я попробовал это с помощью инструкции _die_, но приложение не было убито, и я все еще получаю исключение. – Matthias

+0

Вы уверены, что модуль загружен? ^^ Вы также можете проверить объединенную конфигурацию в своем контроллере или где угодно и выполнить отладку для '$ serviceLocator-> get ('config')', просто чтобы убедиться, что это действительно так. – Sam

Смежные вопросы