问题描述
我正在创建一个名为 IntervalType 的自定义 FormType.我的 IntervalType 将有两个字段,start
和 end
,并且是整数类型.此自定义 FormType 将始终在没有 data_class
的情况下使用.
I'm creating a custom FormType called IntervalType. My IntervalType will have two fields, start
and end
and will be of type integer. This custom FormType will always be used without data_class
.
我想添加一个约束来保证start
低于end
.
I want to add a constraint to guarantee that start
is lower than end
.
如何在没有 data_class
的 FormType 中直接使用 Symfony\Component\Validator\Constraints\Callback?
How do I use the Symfony\Component\Validator\Constraints\Callback directly in a FormType without data_class
?
这是我的IntervalType,仅供参考:
Here is my IntervalType, just for reference:
// src/AppBundle/Form/Type/IntervalType.php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Validator\Constraints\NotBlank;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('start', IntegerType::class, array(
'constraints' => array(
new NotBlank(),
),
))
->add('end', IntegerType::class, array(
'constraints' => array(
new NotBlank(),
),
))
);
}
}
推荐答案
当表单不使用任何 data_class 时,唯一的选择似乎是回调约束.
When the form won't be using any data_class the only option seems to be the Callback constraint.
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class IntervalType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('start', IntegerType::class, array(
'constraints' => array(
new NotBlank(),
),
))
->add('end', IntegerType::class, array(
'constraints' => array(
new NotBlank(),
new Callback(array($this, 'validateInterval')),
),
))
->add('submit', SubmitType::class);
}
public function validateInterval($value, ExecutionContextInterface $context)
{
$form = $context->getRoot();
$data = $form->getData();
if ($data['start'] >= $value) {
$context
->buildViolation('The end value has to be higher than the start value')
->addViolation();
}
}
}
这篇关于无法在没有 data_class 的表单中使用回调断言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!