Conditionally required in Zend Framework's 2 InputFilter

First of all, you may want to enable validation on empty/null values as of Empty values passed to Zend framework 2 validators

You can use a callback input filter as in following example:

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

This will basically work when the value smth is an empty string and the value for type is not 1. If the value for type is 1, then smth has to be different from an empty string.


I couldn't quite get the example by Ocramius to work, as $type->getValue was always NULL. I changed the code slightly to use $context and this did the trick for me:

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