Symfony - 在实体断言注释中使用参数

Symfony - Use parameters in Entity assert annotations

我正在尝试使用 app/config/parameters.yml

中定义的模式在我网站的所有位置设置相同的 phone 正则表达式
parameters:    
    phone_regex: /^[+][3][3]\d{9}$/

如何在我的实体断言注释中检索此模式?

/**
 * @var string
 * @Assert\NotBlank(message = "notBlank")
 * @Assert\Regex(
 *     pattern="%phone_regex%",
 *     message="phone"
 * )
 * @ORM\Column(name="contact_phone", type="string", length=255)
 */
private $contactPhone;

上面的代码不起作用,它在没有正则表达式

的情况下生成 html
<input type="text" id="client_contactPhone" name="client[contactPhone]" required="required" maxlength="255" pattern=".*phone_regex.*" class="form-control">

您可以做到这一点的唯一方法是创建您自己的自定义验证约束。一旦你在一个案例中完成它实际上很容易。

可以在此处找到很好的文档:http://symfony.com/doc/current/validation/custom_constraint.html

基本上是您可以做什么的总结:

  1. 构建可能扩展 Regex 约束的约束
  2. 构建相应的验证器(向其中注入容器或参数以获取您的正则表达式值)
  3. 使用你自己的约束而不是现有的约束。

目前在现有注释中没有使用参数的已知选项。

Joe 有一个很好的解决方案,但我的问题是 - 为什么要将其作为参数?这是您将来计划覆盖的东西吗?我猜不会。相反,您可以简单地制作一个 class w/constant 来保存您需要的信息:

class Phone
{
    const VALID_REGEX = '/^[+][3][3]\d{9}$/';
}

然后,对于您的注释:

/**
 * @var string
 * @Assert\NotBlank(message = "notBlank")
 * @Assert\Regex(
 *     pattern=Phone::VALID_REGEX,
 *     message="phone"
 * )
 * @ORM\Column(name="contact_phone", type="string", length=255)
 */
private $contactPhone;

这样您仍然在使用 Regex 验证器,而不是用另一种自定义验证类型重新发明轮子。

另一个主要好处是您可以在代码中的任何地方使用它,而不必实际将参数注入服务或其他任何东西。此外,access class constants from Twig.

也很容易