2013-05-17 10 views
9

La documentazione ZF2 dice in seguito su defult services documentation;Come utilizzare InputFilterManager per creare InputFilters personalizzati in Zf2

InputFilterManager, associazione a Zend \ Mvc \ Service \ InputFilterManagerFactory. Questo crea e restituisce un'istanza di Zend \ InputFilter \ InputFilterPluginManager, che può essere utilizzata per gestire e mantenere istanze del filtro di input.

Ho una classe di inputfilter zf2 personalizzata e sto aggiungendo filtri e validatori all'interno del metodo init() come segue;

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), 
       ), 
     )); 
} 

Inoltre ho aggiunto seguente chiave del mio module.config.php

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

La mia domanda è, come posso costruire il mio GlassFilter utilizzando InputFilterManager? È un approccio corretto? Ho trovato this thread ma voglio capire la relazione tra InputFilters personalizzati e InputFilterManager.

+0

Se im non sbaglio, a patto che si registra, dovrebbe essere semplice come 'array ('name' = > 'glassfilter') 'sotto la chiave' 'filters'' – Sam

risposta

29

Ok, dopo aver passato 3 ore insanguinate (grazie a un'incredibile (!) Documentazione) l'ho capito. Sto scrivendo la mia soluzione come risposta, sperando che possa aiutare gli altri che vogliono scrivere i propri filtri input personalizzati.

  1. Si dovrebbe registrare l'inputfilter personalizzato in module.config.php da input_filters tasto superiore, non filtrare, filtri, filter_manger, filtermanager ecc ..
  2. Estendere predefinita Zend\InputFilter\InputFilter quando si scrive il proprio GlassFilter.
  3. Scrive i filtri all'interno del metodo init() di GlassFilter, non nello __constructor(). Sarà chiamato automaticamente dopo la costruzione.
  4. Quindi portarlo ovunque tramite inputfiltermanager, non servicemanager direttamente.

Config esempio: esempio

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

Usage:

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

+1 Grazie per il numero' 4'! Per quanto riguarda '1' puoi anche usare alternativamente' Zend \ ModuleManager \ Feature \ FilterProviderInterface'/'getFilterConfig()' in 'Module.php'. – AlexP

+0

Grazie per la spiegazione dettagliata. Nel mio caso la funzione 'init()' non veniva attivata. Questo ha funzionato. – kabirbaidhya

Problemi correlati