Для проверки ключа на тип "массив" и его элементов, но без проверки элементов, если они не являются массивом, в Symfony 3.4 можно использовать комбинацию различных валидаторов.
Во-первых, необходимо убедиться, что ключ является массивом. Для этого можно использовать встроенный валидатор SymfonyComponentValidatorConstraintsType
, задав array
в качестве типа данных:
use SymfonyComponentValidatorConstraints as Assert; // ... $constraint = new AssertCollection([ 'key' => new AssertType('array'), ]);
Во-вторых, чтобы проверять элементы только в том случае, если они являются массивами, можно использовать валидатор SymfonyComponentValidatorConstraintsCallback
, который позволяет выполнить проверку по своим правилам. Определим для него функцию обратного вызова isElementArray
:
use SymfonyComponentValidatorContextExecutionContextInterface; // ... $constraint = new AssertCollection([ 'key' => new AssertType('array'), 'callback' => function ($value, ExecutionContextInterface $context) { // проверяем каждый элемент массива на тип "массив" foreach ($value as $item) { if (!is_array($item)) { return; // пропускаем, если элемент не является массивом } } // добавляем правила для проверки элементов массива, только если они являются массивами foreach ($value as $i => $item) { $context->getValidator() ->inContext($context) ->atPath('key[' . $i . ']') ->validate($item, new AssertCollection([ // здесь добавляем правила валидации для элемента массива // ... ])); } }, ]);
Таким образом, при валидации конкретного значения по заданным правилам, Symfony Validation будет проверять ключ на тип "массив", а затем, если ключ является массивом, будет проверять каждый его элемент на соответствие своим правилам. Если элемент не является массивом, он будет пропущен и не будет проверяться.
Однако следует отметить, что использование валидатора Callback
может приводить к неопределённым значениям в массиве ошибок, поскольку валидация будет выполняться на этапе выполнения кода. Это означает, что при необходимости прогнозирования и обработки ошибок в коде может потребоваться более сложная реализация.
Надеюсь, это поможет вам проверить ключ на тип "массив" и его элементы, но не проверять элементы, если они не являются массивом.