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

时间:2017-07-11 13:44:26

标签: symfony annotations assert symfony-3.2

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

中定义的模式在我的网站上随处设置相同的手机正则表达式
parameters:    
    phone_regex: /^[+][3][3]\d{9}$/

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

/**
 * @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">

2 个答案:

答案 0 :(得分:3)

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

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

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

  1. 构建可能扩展正则表达式约束的约束
  2. 构建相应的Validator(将容器或参数注入其中以获取正则表达式值)
  3. 使用您自己的约束而不是现有的约束。
  4. 目前没有已知的选项可以在现有注释中使用参数。

答案 1 :(得分:3)

Joe有一个很好的解决方案,但我的问题是 - 为什么这个作为参数呢?这是你将来计划压倒的东西吗?我不猜。相反,你可以简单地创建一个包含所需信息的常量类:

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很容易。