php - 如果条件匹配则应用约束

标签 php symfony formbuilder

我有一个 Symfony 表单。在这个表单中,我有两个字段:

“门牌号”和“邮政信箱”。它们的定义如下:

$builder->add('houseNumber', TextType::class, [
    'label' => 'Huisnummer',
    'attr' => [
        'maxlength' => 8,
    ],
    'constraints' => [
        new NotBlank([
            'groups' => $options['constraint_groups']
        ]),
        new Regex([
            'pattern' => '/^[0-9]+$/',
            'message' => 'Vul alleen het huisnummer in cijfers in.'
        ]),
        new Length([
            'groups' => $options['constraint_groups'],
            'max' => 8
        ])
    ]
])->add('poBox', TextType::class, [
    'label' => 'Postbus',
    'attr' => [
        'maxlength' => 10,
    ],
    'constraints' => [
        new Length([
            'groups' => $options['constraint_groups'],
            'max' => 10
        ])
    ]
]);

有没有办法让我在 PoBox 存在的情况下不需要门牌号码,反之亦然?

谢谢。

最佳答案

您可以创建自定义验证约束

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 * @Target({"CLASS", "ANNOTATION"})
 */
class HouseNumber extends Constraint
{
    public $message = 'Some message';

    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}

验证器

namespace App\Validator\Constraints;

use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class HouseNumberValidator extends ConstraintValidator
{
    public function validate($obj, Constraint $constraint)
    {
        if (!$constraint instanceof HouseNUmber) {
            throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\HouseNUmber');
        }

        $error = null;

        if (!$this->isValid($obj)) {
            $error = $constraint->message;
        }

        if (!empty($error)) {
            $this->context->buildViolation($error)
                ->atPath('houseNumber')
                ->addViolation();
        }
    }

    private function isValid($obj)
    {    
        if (!$obj instanceof SomeClass) {
            throw new UnexpectedTypeException($obj, SomeClass::class);
        }

        if (!empty($obj->getPoBox())) {
            return true;
        }

        return !empty($obj->getHouseNumber());
    }
}

并在类中的字段 $houseNumber 中添加注释

use App\Validator\Constraints as AppAssert;

/**
 * @AppAssert\HouseNumber
 */
class SomeClass 
{
    private $houseNumber;
    ...
}

关于php - 如果条件匹配则应用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58215531/

相关文章:

php - 计算列或存储过程或只需要 php 函数?

javascript - 使用 jQuery 获取 php 的结果

symfony - FOSUserBundle 无需密码注册

php - 使用 SYmfony 在 PHP 中处理 "Undefined Index"

php - 如何在 Symfony 4 的 Twig 的 {{ dump() }} 中停用 Xdebug 转储数据的方法

sql-server - MS 的数据库表单生成器

php - 使用带有 RSS 提要的 PHP_URL_QUERY 复制内容

php - 如何抢IP :PORT with regex?

ruby-on-rails - 如何修改 Rails 3 表单生成器

javascript - 需要帮助构建 radio 输入列表的 react 形式