更改实体断言无需FormType即可动态约束

时间:2019-04-12 09:13:27

标签: php symfony validation entity

所以问题是这样的:

我正在尝试从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。

3 个答案:

答案 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);

默认组是一个未指定组的组,另一个是我在字段中指定的组