所以问题是这样的:
我正在尝试从API保存一些数据,我需要使用Symfony验证来验证它们,例如:
private $id;
/**
* @var
* @Assert\Length(max="255")
* @CustomAssert\OrderExternalCode()
* @CustomAssert\OrderShipNoExternalCode()
*/
private $code;
private $someId;
/**
* @var
* @Assert\NotBlank()
* @Assert\Length(max="255")
*/
private $number;
这很好用,但是现在我需要从控制器动态添加一些断言约束,这就是我遇到的问题!
有人知道该怎么做或任何可能有用的建议吗?
当前,我做了一个额外的约束,即在数据库中执行额外的查询,而我不想这样做,而且我没有使用FormType。
答案 0 :(得分:1)
您可以使用groups
并使用(或忽略)您正在谈论的额外小组。
答案 1 :(得分:0)
在您的情况下,使用 CallbackConstraint 应该会有所帮助:
use My\Custom\MyConstraint;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
// This is not tested !
class MyEntity
{
/**
* @Assert\Callback()
*/
public function validateSomeId(ExecutionContextInterface $context)
{
$constraint = new MyConstraint(['code' => $this->code]);
$violations = $context->getValidator()->validate($this->number, $constraint);
foreach ($violations as $violation) {
$context->getViolations()->add($violation);
}
}
}
请参见https://symfony.com/doc/current/reference/constraints/Callback.html
编辑:我不知道您要验证什么,所以我只是将您实体的一些随机参数放在其中
答案 2 :(得分:0)
所以我想根据控制器中的条件动态地验证请求数据。
我为实体中的对象指定了一个额外的组,如下所示:
/**
* @var
* @Assert\NotBlank(groups={"extra_check"})
* @Assert\Length(max="255")
*/
private $externalId;
然后在控制器中,我只是做了条件来验证是否有额外的组。
$groups = $order->getExternalCode() != null ? ['Default'] : ['Default', 'extra_check'];
$this->validateRequest($request, null, $groups);
默认组是一个未指定组的组,另一个是我在字段中指定的组