【问题标题】:Change Entity assert constrains dynamically without FormType在没有 FormType 的情况下动态更改实体断言约束
【发布时间】:2019-04-12 09:13:27
【问题描述】:

所以问题是这样的:

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

【问题讨论】:

  • 你可以在你的控制器中使用 Symfony Validator 服务:symfony.com/doc/current/validation.html
  • 我正在这样做,但我需要根据特定字段的某些条件添加额外的约束。

标签: php symfony validation entity


【解决方案1】:

您可以使用groups 并使用(或省略)您正在谈论的额外组。

【讨论】:

  • 是的,我就是这样做的
【解决方案2】:

在您的情况下,我认为使用 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

编辑:我不知道您要验证什么,所以我只是将您实体的一些随机参数放在那里

【讨论】:

  • 我认为这行不通,因为我需要从数据库中检查一个我已经在控制器中拥有的字段!
  • 如果这个字段在同一个实体上,那么你应该不需要从数据库中获取它。如果它在另一个实体中,那么您必须无论如何都要进行数据库调用...
  • 不,不幸的是它不在同一个实体中,这就是我试图在没有数据库调用的情况下这样做的问题:/
  • 嗯,您的数据在数据库中,因此您不能凭空神奇地将其弹出。在显示表单时获取它并将其作为隐藏字段添加到表单中您正在验证的实体中(并将回调约束与有效负载一起使用),或者在提交后获取它并针对它进行验证。
  • 我在问题中提到我没有使用 FormType,并且我已经在控制器中有数据库实体,这就是为什么我想知道如果有人知道任何不同的方式来添加特定的验证实体:)
【解决方案3】:

所以我想根据控制器中的条件动态验证请求数据。

我在实体中为它指定了一个额外的组,如下所示:

    /**
      * @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);

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

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2014-03-08
    • 1970-01-01
    • 2022-01-23
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多