Zend Input filter : validation multi-champs

J’ai dernièrement eu besoin de faire une validation multi-champs sur un projet qui utilise Zend Form et Zend Input Filter.

Zend Input Filter passe à chaque validateur un tableau $context en deuxième paramètre qui contient, par défaut, les valeurs de tous les champs du groupe de validation. Il suffit donc dans un validateur custom ou via le validateur Zend\Validator\Callback de récupérer les valeurs souhaitées.

Par exemple, j’ai eu besoin de vérifier qu’une date de fin est bien supérieure à une date de début, voici donc mon callback :

function ($value, $context = []) {
    $startDate = new DateTime($context['startDate'] ?? null);
    $endDate = new DateTime($value);

    return $startDate < $endDate;
}

Et l’implémentation sous forme de specification :

/**
 + @return array
 */
public function getInputFilterSpecification() : array
{
    return [
        'startDate' => [
            'required' => true,
        ],
        'endDate' => [
            'required' => false,
            'validators' => [
               [
                   'name' => Callback::class,
                   'options' => [
                        'callback' => function ($value, $context = []) {
                            $startDate = new DateTime($context['startDate'] ?? null);
                            $endDate = new DateTime($value);

                            return $startDate < $endDate;
                        },
                        'messages' => [
                            Callback::INVALID_VALUE => '%value% must be greater than the start date',
                        ],
                   ],
               ],
            ],
        ],
    ];
}