2012-11-17 15 views
6

Składam wniosek za pomocą Zend Framework 2. Sprawdzam poprawność danych wejściowych przy użyciu jej InputFilter. Czy jest możliwe, aby niektóre warunki były wymagane warunkowo? Znaczy, mam kod tak:Wymagany warunkowo w Zend Framework's 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 
))); 

Chcę pole something, aby być wymagane, gdy tylko type jest równa 1. Czy istnieje wbudowany sposób, aby to zrobić? Czy powinienem po prostu stworzyć własny weryfikator?

Odpowiedz

8

Przede wszystkim, można włączyć walidację na pustych wartości null/dzień Empty values passed to Zend framework 2 validators

można użyć filtru wejściowego zwrotna jak w poniższym przykładzie:

$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); 

to będzie w zasadzie działa, gdy wartość smth jest pusty String nd wartość dla type nie jest 1. Jeśli wartość dla type to 1, wówczas smth musi różnić się od pustego ciągu.

+0

Należy zauważyć, że ze względu na bardzo luźny sposób sprawdzania interfejsów przez PHP, możliwe jest również zdefiniowanie walidatora za pomocą metody 'isValid ($ value, array $ context = [])'. W ten sposób można użyć '$ context' do włączania/wyłączania sprawdzania poprawności w kontekście. – Ocramius

-3

Niestety trzeba by ustawić żądaną opcję opartą na swoich warunkach tak:

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

To jest złe. W ten sposób ustawiasz wartości dotyczące filtru na podstawie żądania, które ma być filtrowane: jest ono koncepcyjnie błędne. – Ocramius

1

Nie udało mi się uzyskać przykładu, który zrobił Ocramius, ponieważ $ typ-> getValue zawsze był NULL. Zmieniłem kod nieco, aby użyć kontekstu $ i to mi się udało:

$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, $context){ 
     return $value || (1 != $context['type']); 
    })); 

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