2012-11-17 8 views
6

Ich mache eine Anwendung mit Zend Framework 2. Ich validiere Eingabe mit es ist InputFilter. Ist es möglich, einige Input s bedingt erforderlich zu machen? Ich meine, ich habe Code wie folgt aus:Bedingt erforderlich in Zend Framework 2 InputFilter

$filter = new \Zend\InputFilter\InputFilter(); 
$factory = new \Zend\InputFilter\Factory(); 
$filter->add($factory->createInput(array(
    'name' => 'type', 
    'required' => true 
))); 
$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => true 
))); 

ich das Feld wollen something, benötigt werden, nur, wenn type gleich 1. Gibt es eine eingebaute Möglichkeit, das zu tun? Oder sollte ich nur einen benutzerdefinierten Validator erstellen?

Antwort

8

Zunächst einmal sollten Sie die Validierung auf leeren/Nullwert als von Empty values passed to Zend framework 2 validators

ermöglichen Sie können einen Rückruf Eingangsfilter, wie in folgendem Beispiel verwenden:

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) use ($type) { 
     return $value || (1 != $type->getValue()); 
    })); 

$filter->add($type); 
$filter->add($smth); 

Dies wird grundsätzlich funktionieren, wenn der Wert smth eine leere Zeichenkette a nd der Wert für type ist nicht 1. Wenn der Wert für type1 ist, muss sich smth von einer leeren Zeichenfolge unterscheiden.

+0

Beachten Sie, dass aufgrund der sehr lockeren Art der Schnittstellenprüfung von PHP auch ein Validator mit der Methode 'isValid ($ value, array $ context = [])' definiert werden kann. Auf diese Weise kann '$ context' verwendet werden, um die Validierung kontextabhängig zu aktivieren/deaktivieren. – Ocramius

-3

Leider würden Sie die gewünschte Option auf der Grundlage Ihrer Bedingungen wie so einstellen:

$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => (isset($_POST['type']) && $_POST['type'] == '1'), 
))); 
+4

Das ist falsch. Sie legen hiermit Werte für einen Filter fest, der auf der Anfrage basiert, die gefiltert werden muss: Sie ist konzeptionell falsch. – Ocramius

1

Ich konnte das Beispiel von Ocramius nicht richtig zum arbeiten bekommen, da $ type-> getValue immer NULL war. Ich änderte den Code ein wenig, um $ context zu verwenden, und das hat den Trick für mich gemacht: