Какую версию symfony вы используете?
Я бы предложил вам создать собственное ограничение проверки для выполнения задачи.
Для этого вам нужно будет создать и расширитьдва класса.
- A
Constraint
, которые будут использоваться для именования ограничения и его использования. - A
ConstraintValidator
, который будет выполнять проверку.
Оба класса должны находиться в одном и том же пространстве имен.
Примером Ограничения может быть:
namespace FooBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class ArrayStructure extends Constraint
{
public $message = "The array structure is invalid";
}
NB Свойство "message" будетиспользуется в валидаторе для отображения сообщения об ошибке. *
ConstraintValidator может быть:
namespace FooBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
class ArrayStructureValidator extends ConstraintValidator
{
public function validate($array, Constraint $constraint)
{
if (!$constraint instanceof ArrayStructure) {
throw new UnexpectedTypeException($constraint, ArrayStructure::class);
}
foreach ($array as $element) {
$reqired = null;
switch ($element['type']) {
case 'foo':
$reqired = "abc";
case 'bar':
$reqired = "xyz";
}
if ($reqired) {
if (array_key_exists($reqired, $element)) {
$this->context
->buildViolation($constraint->message)
->addViolation()
;
}
}
}
}
}
NB Имя класса должно бытьтак же, как Constraint + "Validator" *
Вы можете использовать созданное вами пользовательское ограничение Validation, указав его использование в форме в нужных полях, например:
// ...
use FooBundle\Validator\Constraints\ArrayStructure;
class FooBarType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add("array", BarType::class, [
"constraints" => [new ArrayStructure ()]
])
// ...
}
}
Для полной ссылки перейдите по этой ссылке .
Я надеюсь, что это было полезно.