Symfony Form约束连接beetwen字段

时间:2018-02-01 08:33:14

标签: php symfony

我对约束有疑问,

https://symfony.com/doc/current/reference/constraints.html

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

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

  • 如果选中复选框A,则也必须选中复选框B.

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

现在的问题是:

我是否可以通过约束来制作这样的逻辑(如果是的话 - 如果有人可以提供示例,那将会是非法的?)或唯一的方法是将此逻辑移动到控制器?

2 个答案:

答案 0 :(得分:2)

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

类似的东西:

<?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();
        }
    }
}

答案 1 :(得分:2)

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

Symfony为您提供了3个工具:

The Callback Constraints这是一个自定义的php函数(参见@Yoshi回答&#39;)

The Expression Constraint这是一个解析的自定义表达式。例如:

fileButton.addEventListener('change', function(ev)
{
    var file = fileButton.files[0];
    var formData = new FormData();
    formData.append('file', file);
    formData.append('ajax', 'fileUpload');
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'index.php', true);
    xhr.onload = function ()
    {
        ...
    };
    xhr.send(formData);
}, false);

或您自己的custom constraint