【问题标题】:Multiple Custom Validation Constraint in Symfony2Symfony2 中的多个自定义验证约束
【发布时间】:2013-11-15 13:28:45
【问题描述】:

我使用 de oficial documentation 创建了多个验证器,它们都可以正常工作,但只有在我单独使用时。 在一个包中我定义了这个:

# Resources/config/validation.ynl
SF\SomeBundle\Entity\SomeEntity:
    properties:
        name:
            - NotBlank: ~
            - SF\UtilsBundle\Validator\Constraints\ContainsAlphanumeric: ~
            - SF\UtilsBundle\Validator\Constraints\MinLength: ~

ContainstAlphanumeric 类验证器:

if (!preg_match('/^[a-z\d_]$/i', $value, $matches)) {
    $this->context->addViolation($constraint->message, array('%string%' => $value));
}

MinLength 类验证器

$min = 5;
if( strlen($value) < $min )
{
    $this->context->addViolation($constraint->message, array('%string%' => $value, '%min_length%' => $min));
}

所以,当我提交表单并且输入的值为“q”时,验证器 MinLength 返回长度错误,但如果相同的输入具有值“qwerty”,验证器包含字母数字返回非法字符消息。

有什么想法吗?

编辑:

我更改了 Resources/config/validation.yml 文件以使用本机 SF2 Contraints 长度验证器:

properties:
    name:
        - NotBlank: ~
        - Length: { min: 5, minMessage: "El nombre debe tener almenos {{ limit }} caracteres." }
        - SF\UtilsBundle\Validator\Constraints\ContainsAlphanumeric: ~

我发现了一个新行为:一些错误显示在树枝模板中

{{ form_errors(form) }}

和其他错误使用

{{ form_errors(form.some_field) }}

这很奇怪!

【问题讨论】:

标签: php validation symfony symfony-2.3


【解决方案1】:

看起来正则表达式是错误的

preg_match('/^[a-z\d_]$/i', $value, $matches)

匹配集合[a-z\d_]中的任何单个字符

注意这里的输出:http://regex101.com/r/eO8bF0

如果您修复它以便匹配该设置的 0 个或多个字符(因此添加 *),它应该可以工作

preg_match('/^[a-z\d_]*$/i', $value, $matches)

http://regex101.com/r/rC4qO3


编辑 回答你的其他问题

{{ form_errors(form) }}

这将显示表单本身的错误,以及冒泡到表单的错误。请参阅关于错误冒泡 http://symfony.com/doc/current/reference/forms/types/text.html#error-bubbling

的文档
{{ form_errors(form.some_field) }}

这将显示特定字段的错误。

【讨论】:

  • 没错,我的正则表达式是错误的,但验证器的行为仍然是错误的。
  • 我不确定你的意思。你所描述的正是我所期望的:“所以,当我提交一个表单并且输入的值为'q'时,验证器 MinLength 返回一个长度错误,但如果相同的输入具有值'qwerty',验证器ContainsAlphanumeric 返回非法字符消息。”如果您修复您的正则表达式,您将不会遇到“qwerty”的验证错误,因为它至少有 5 个字符并且与您的正则表达式匹配。
  • 所以请解释一下您的期望,因为我不知道您所说的“错误”是什么意思
  • “错误”是指验证器的行为是错误的,因为并不总是返回消息。
【解决方案2】:

对于我没有发现的问题,验证器没有为表单的所有字段返回错误,正如我在询问时所说的那样,一些错误出现在 form_errors(form.widget) 和其他 form_errors(form) 我使用Validation Service 解决了我的问题(但我不知道这是否是最好的方法)并将错误返回给 twig。

在行动中:

$form = $this->createCreateForm($entity);
$form->handleRequest($request);

if ($form->isValid())
{
    # Magic code :D
}

return array(
    'entity' => $entity,
    'form'   => $form->createView(),
    'errors' => $this->get('validator')->validate($form) # Here's the magic :D
);

在树枝模板中:

{% if errors is defined %}
    <ul>
        {% for error in errors %}
            <li>
                {{ error.message }}
            </li>
        {% endfor %}
    </ul>
{% endif %}

谢谢你的帮助:D

PD:我决定不使用 error_bubbling 来不修改每个表单字段。

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多