phpzend-framework2zend-form

Conditionally required in Zend Framework's 2 InputFilter


I am making an application using Zend Framework 2. I am validating input using it's InputFilter. Is it possible, to make some Inputs required conditionally? I mean I have code like that:

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

I want the field something, to be required, ONLY when type is equal 1. Is there a built-in way to do that? Or should I just create custom validator?


Solution

  • 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.