Symfony2中的多个自定义验证约束

时间:2013-11-04 20:00:03

标签: php validation symfony symfony-2.3

我使用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 Class验证器:

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”,则验证器ContainsAlphanumeric返回非法字符消息。 / p>

有什么想法吗?

修改

我更改了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) }}

这太奇怪了!

2 个答案:

答案 0 :(得分:0)

看起来正则表达式错误

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) }}

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

答案 1 :(得分:0)

对于我未发现的问题,验证程序没有为表单的所有字段返回错误,正如我在问的时候所说,有些错误在form_errors(form.widget)和其他form_errors(form)看到了 我解决了我的问题(但我不知道这是否是最好的方法)使用Validation Service并将错误返回到树枝。

在行动中:

$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来修改每个表单字段。