Php Symfony表单约束连接字段

Php Symfony表单约束连接字段,php,symfony,Php,Symfony,我对约束有疑问 我有多个复选框的实体(布尔类型) 现在我需要一些非标准逻辑,比如: 如果选中复选框A,则必须同时选中复选框B 如果选中了复选框A、B、C,则必须也选中复选框D 现在的问题是: 我是否能够在约束条件下做出这样的逻辑(如果是-如果有人能提供示例,那就太好了)?或者唯一的方法是将此逻辑移动到控制器?我认为最简单的解决方案是使用: 比如: <?php namespace App\Entity; use Symfony\Component\Validator\Constra

我对约束有疑问

我有多个复选框的实体(布尔类型)

现在我需要一些非标准逻辑,比如:

  • 如果选中复选框A,则必须同时选中复选框B

  • 如果选中了复选框A、B、C,则必须也选中复选框D

现在的问题是:


我是否能够在约束条件下做出这样的逻辑(如果是-如果有人能提供示例,那就太好了)?或者唯一的方法是将此逻辑移动到控制器?

我认为最简单的解决方案是使用:

比如:

<?php

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Entity
{
    private $checkbox_a = false;
    private $checkbox_b = false;
    private $checkbox_c = false;
    private $checkbox_d = false;

    /**
     * @Assert\Callback
     *
     * @param ExecutionContextInterface $context
     * @param mixed                     $payload
     */
    public function validate(ExecutionContextInterface $context, $payload)
    {
        if ($this->checkbox_a && !$this->checkbox_b) {
            $context->buildViolation('Must be checked because of checkbox_a!')
                ->atPath('checkbox_b')
                ->addViolation();
        }

        if ($this->checkbox_a && $this->checkbox_b && $this->checkbox_c && !$this->checkbox_d) {
            $context->buildViolation('Must be checked because of all others are checked!')
                ->atPath('checkbox_d')
                ->addViolation();
        }
    }
}

由于您的逻辑是特定的,您必须执行一些特定的代码来验证它

Symfony为您提供了3种工具:

这是一个定制的php函数(参见@Yoshi answer's)

这是已解析的自定义表达式。例如:

/**
 * @Assert\Expression(
 *     "'1' in this.getCheckboxValues() and !('3' in this.getCheckboxValues())",
 * )
 */
还是你自己的