ComponentValidator — Как сделать проверку на «Отсутствует или массив»?

Для проверки на "Отсутствует или массив" в Symfony можно воспользоваться компонентом Validator.

Начнем с создания валидатора. Для этого создайте новый класс, например "MyValidator", который будет реализовывать интерфейс ConstraintValidatorInterface. В методе validate() данного класса, вы сможете осуществить проверку на "Отсутствует или массив".

use SymfonyComponentValidatorConstraint;
use SymfonyComponentValidatorConstraintValidator;
use SymfonyComponentValidatorExceptionUnexpectedTypeException;
use SymfonyComponentValidatorExceptionUnexpectedValueException;

class MyValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (null === $value || !is_array($value)) {
            $this->context->buildViolation($constraint->message)
                ->addViolation();
        }
    }
}

Затем необходимо создать собственный Constraint (ограничение), которое будет использоваться в валидации. В этом Constraint вам нужно указать имя своего валидатора.

use SymfonyComponentValidatorConstraint;

/**
 * @Annotation
 */
class MyConstraint extends Constraint
{
    public $message = 'Значение должно быть массивом или пустым';

    public function validatedBy()
    {
        return MyValidator::class;
    }
}

Теперь когда у вас есть валидатор и ограничение, вы можете использовать их в своем коде. Например, вы можете добавить следующую аннотацию к своему свойству или методу контроллера:

use AppConstraintsMyConstraint;

/**
 * @MyConstraint()
 */
public function myAction($value)
{
    ...
}

При выполнении этого метода, Symfony будет автоматически проверять значение на "Отсутствует или массив" и, если оно не соответствует этому условию, будет выбрасывать исключение с сообщением, указанным в конструкторе ограничения.

Надеюсь, эта информация поможет вам в решении вашей задачи на проверку на "Отсутствует или массив" при использовании Symfony и компонента Validator.