【问题标题】:Sequently validate two different constraints with Symfony使用 Symfony 依次验证两个不同的约束
【发布时间】:2021-12-28 09:39:14
【问题描述】:

我正在使用 Symfony 4.4,我的表单如下:

<?php

declare(strict_types=1);

namespace App;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MainForm extends AbstractType
{
    public const GROUP_CREATE = 'create';
    public const GROUP_UPDATE = 'update';

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('zone', TargetingZoneForm::class, [
                'targeting_validation_groups' => [
                    MainForm::GROUP_CREATE,
                    MainForm::GROUP_UPDATE,
                ],
            ])
        ;
    }
}

class TargetingZoneForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('is_excluded', CheckboxType::class, [
                'constraints' => [
                    new \Symfony\Component\Validator\Constraints\Type([
                        'type' => 'bool',
                        'groups' => $options['targeting_validation_groups'],
                    ]),
                ],
            ])
            ->add('list', CollectionType::class, [
                'entry_type' => IntegerType::class,
                'entry_options' => [
                    'constraints' => [
                        new \Symfony\Component\Validator\Constraints\Range([
                            'min' => 1,
                            'max' => 2147483647,
                            'groups' => $options['targeting_validation_groups'],
                        ]),
                    ],
                ],
                'allow_add' => true,
                'allow_delete' => true,
                'error_bubbling' => false,
                'constraints' => [
                    new \Symfony\Component\Validator\Constraints\Count([
                        'max' => \App\Model\Zone::ZONE_LIMITATIONS_MAX,
                        'maxMessage' => 'You can use up to {{ limit }} zones',
                        'groups' => $options['targeting_validation_groups'],
                    ]),
                    new \App\Constraints\Zone([
                        'groups' => $options['targeting_validation_groups'],
                    ]),
                ],
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        parent::configureOptions($resolver);

        $resolver->setRequired(['targeting_validation_groups']);
        $resolver->setAllowedTypes('targeting_validation_groups', 'array');
    }
}

我的payload是这样的:

{
  "zone": {
    "list": [
      "1",
      "26606653111701",
      "3"
    ],
    "is_excluded": false
  }
}

我想为Range 约束验证集合的所有元素,并且只有在它有效的情况下 - 在 if 之后触发我的自定义 \App\Constraints\Zone 约束(因为在里面我将拥有所有有效的 ID 并发送单个 DB询问)。我没有通过GroupSequence 这样做。

我无法使用Sequentially,因为我使用的是 Symfony 4.4。

【问题讨论】:

    标签: php symfony symfony4 symfony-validator


    【解决方案1】:

    您似乎需要All Constraint。您可以将其应用于具有相同值的数组,例如表单的 list 属性中的整数数组。然后,您可以传递您需要的任何约束,它们将应用于数组的每个元素。

    从文档来看,它应该在 Symfony 4.4 中可用。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多