Как с помощью Sypfony Validation 3.4 проверить ключ на тип массиву + его элементы, но не проверять элементы если не массив?

Для проверки ключа на тип "массив" и его элементов, но без проверки элементов, если они не являются массивом, в 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 может приводить к неопределённым значениям в массиве ошибок, поскольку валидация будет выполняться на этапе выполнения кода. Это означает, что при необходимости прогнозирования и обработки ошибок в коде может потребоваться более сложная реализация.

Надеюсь, это поможет вам проверить ключ на тип "массив" и его элементы, но не проверять элементы, если они не являются массивом.