我正在创建一个名为IntervalType的自定义FormType。我的IntervalType将有两个字段start
和end
,其类型为整数。此自定义FormType将始终在没有data_class
的情况下使用。
我想添加一个约束来保证start
低于end
。
如何在没有data_class
的FormType中直接使用Symfony \ Component \ Validator \ Constraints \ Callback?
这是我的IntervalType,仅供参考:
// 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(),
),
))
);
}
}
答案 0 :(得分:8)
当表单不能使用任何data_class时,唯一的选项似乎是Callback约束。
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();
}
}
}