class testForm extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('constraints', [new Callback(['callback' => function ($payload, ExecutionContextInterface $context) {
$data = $context->getObject()->getData();
if (strtolower($data['field1']) != strtolower($data['field2'])) {
$context
->buildViolation('fields must be equal')
->atPath('[field1]')
->addViolation();
}
}])]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('field1', TextType::class, ['constraints' => [new NotBlank]])
->add('field2', TextType::class, ['constraints' => [new NotBlank]]);
}
}
< /code>
Это не мой фактический код, а просто для того, чтобы показать концепцию того, что я пытаюсь сделать: у меня есть форма, в которой требуется каждое отдельное поле, а затем некоторые проверки запускаются на Значения нескольких полей в комбинации. < /p>
Проблема, которую я столкнулся с этим кодом, заключается в том, что оно будет выбросить уведомление, когда вы отправляете с пустыми полями (null
не разрешен в качестве параметра для strtolower ).
afaict это связано с тем, что валидация родителей выполняется до проверки ребенка, поэтому он проверяет, только если у поля есть значения После выполнения проверки верхнего уровня. Глядя на документацию Symfony, существует действительное ограничение , которое, кажется, делает именно это, но, кажется, работает только с объектами (моя форма не использует объект, но простой DTO). < Br/> Поэтому мне было интересно: есть ли способ сделать действительный работать без сущностей или какого -либо другого ограничения/способа сделать это, который я упустил из виду?
У меня есть код, который более или менее похож на это: < /p> [code]class testForm extends AbstractType { public function configureOptions(OptionsResolver $resolver) { $resolver->setDefault('constraints', [new Callback(['callback' => function ($payload, ExecutionContextInterface $context) { $data = $context->getObject()->getData();
if (strtolower($data['field1']) != strtolower($data['field2'])) { $context ->buildViolation('fields must be equal') ->atPath('[field1]') ->addViolation(); } }])]); }
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('field1', TextType::class, ['constraints' => [new NotBlank]]) ->add('field2', TextType::class, ['constraints' => [new NotBlank]]); } } < /code> Это не мой фактический код, а просто для того, чтобы показать концепцию того, что я пытаюсь сделать: у меня есть форма, в которой требуется каждое отдельное поле, а затем некоторые проверки запускаются на Значения нескольких полей в комбинации. < /p> Проблема, которую я столкнулся с этим кодом, заключается в том, что оно будет выбросить уведомление, когда вы отправляете с пустыми полями (null[/code] не разрешен в качестве параметра для strtolower ). afaict это связано с тем, что валидация родителей выполняется до проверки ребенка, поэтому он проверяет, только если у поля есть значения После выполнения проверки верхнего уровня. Глядя на документацию Symfony, существует действительное ограничение , которое, кажется, делает именно это, но, кажется, работает только с объектами (моя форма не использует объект, но простой DTO). < Br/> Поэтому мне было интересно: есть ли способ сделать действительный работать без сущностей или какого -либо другого ограничения/способа сделать это, который я упустил из виду?