我使用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) }}
这太奇怪了!
答案 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)
修改强> 回答你的其他问题
{{ 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来修改每个表单字段。