我对约束有疑问,
https://symfony.com/doc/current/reference/constraints.html
我的实体有多个复选框(布尔类型)。
现在我需要一些非标准逻辑,如:
如果选中复选框A,则也必须选中复选框B.
如果选中复选框A,B,C,则必须选中复选框D
现在的问题是:
我是否可以通过约束来制作这样的逻辑(如果是的话 - 如果有人可以提供示例,那将会是非法的?)或唯一的方法是将此逻辑移动到控制器?
答案 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