2013-05-17 12 views
9

Dokumentacja ZF2 mówi następująco na defult services documentation;Jak używać InputFilterManager do konstruowania niestandardowych filtrów wejściowych w Zf2

InputFilterManager, mapowanie do Zend \ Mvc \ Service \ InputFilterManagerFactory. To tworzy i zwraca instancję Zend \ InputFilter \ InputFilterPluginManager, która może być używana do zarządzania i utrzymywania instancji filtra wejściowego.

Mam niestandardową klasę filtru wejścia zf2 i dodaję filtry i sprawdzania poprawności wewnątrz metody init(), jak poniżej;

namespace Application\Filter; 
use Zend\InputFilter\InputFilter; 

class GlassFilter extends InputFilter 
{ 
    public function init() 
    { 
     $this->add(array(
       'name' => 'glassname', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StringToUpper'), 
       ), 
       'validators' => array(
        array('name' => 'StringLength', 'options' => array('min' => 3), 
       ), 
     )); 
} 

Również I dodaje następujący klucz do mojego module.config.php

'filters' => array(
    'invokables' => array(
     'glassfilter' => '\Application\Filter\GlassFilter', 
    ), 
), 

moje pytanie, w jaki sposób można skonstruować moje GlassFilter użyciu InputFilterManager? Czy to właściwe podejście? Znalazłem this thread, ale chcę zrozumieć związek między niestandardowymi InputFilters i InputFilterManager.

+0

jeśli im nie myli, tak długo, jak zarejestrować go, to powinno być tak proste, jak 'array ('name' = > "glassfilter") 'pod' 'filtrami''-kluczem – Sam

Odpowiedz

29

Dobra, po 3 godzinach cholernych godzin (dzięki niewiarygodnej (!) Dokumentacji) odkryłem to. Piszę moje rozwiązanie jako odpowiedź, mam nadzieję, że pomoże to innym, którzy chcą napisać własne filtry danych wejściowych.

  1. należy zarejestrować swój własny inputfilter w module.config.php przez input_filters top kluczowych, nie filtracyjne, filtry, filter_manger, filtermanager etc ..
  2. Extend domyślne Zend\InputFilter\InputFilter pisząc własną GlassFilter.
  3. Napisz swoje filtry wewnątrz metody init() z GlassFilter, a nie w __constructor(). Zostanie on wywołany automatycznie po zakończeniu budowy.
  4. Następnie pobierz go w dowolnym miejscu poprzez inputfiltermanager, a nie servicemanager bezpośrednio. Przykładem

Config: przykład

'input_filters' => array(
    'invokables' => array(
     'glassfilter' => '\Application\Filter\GlassFilter', 
    ), 
), 

Zastosowanie:

$glassfilter = $serviceLocator->get('InputFilterManager')->get('glassfilter'); 
+2

+1 Dziękuję za numer' 4'! Jeśli chodzi o '1' możesz również użyć' Zend \ ModuleManager \ Feature \ FilterProviderInterface'/'getFilterConfig()' w 'Module.php'. – AlexP

+0

Dzięki za wyjaśnienie szczegółów. W moim przypadku funkcja 'init()' nie była wyzwalana. To sprawiło, że działało. – kabirbaidhya