如何处理不同的错误级别
有时,您可能希望根据某些规则以不同的方式显示约束验证错误消息。例如,您有一个新用户注册表单,他们在其中输入一些个人信息并选择他们的身份验证凭据。他们必须选择用户名和安全密码,但提供银行帐户信息是可选的。尽管如此,您要确保这些可选字段(如果输入)仍然有效,但以不同的方式显示其错误。
实现此行为的过程包括两个步骤:
- 对验证约束应用不同的错误级别;
- 根据配置的错误级别自定义您的错误消息。
1. 分配错误级别
使用 payload
选项为每个约束配置错误级别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// src/Entity/User.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class User
{
#[Assert\NotBlank(payload: ['severity' => 'error'])]
protected string $username;
#[Assert\NotBlank(payload: ['severity' => 'error'])]
protected string $password;
#[Assert\Iban(payload: ['severity' => 'warning'])]
protected string $bankAccountNumber;
}
2. 自定义错误消息模板
当 User
对象的验证失败时,您可以使用 getConstraint() 方法检索导致特定失败的约束。每个约束都将附加的 payload 作为公共属性公开。
1 2 3 4 5
// a constraint validation failure, instance of
// Symfony\Component\Validator\ConstraintViolation
$constraintViolation = ...;
$constraint = $constraintViolation->getConstraint();
$severity = $constraint->payload['severity'] ?? null;
例如,您可以利用此功能自定义 form_errors
块,以便将严重性添加为额外的 HTML 类。
1 2 3 4 5 6 7 8 9
{%- block form_errors -%}
{%- if errors|length > 0 -%}
<ul>
{%- for error in errors -%}
<li class="{{ error.cause.constraint.payload.severity ?? '' }}">{{ error.message }}</li>
{%- endfor -%}
</ul>
{%- endif -%}
{%- endblock form_errors -%}
另请参阅
有关自定义表单渲染的更多信息,请参阅 如何自定义表单渲染。
本作品,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可获得许可。