跳到内容

如何处理不同的错误级别

编辑此页

有时,您可能希望根据某些规则以不同的方式显示约束验证错误消息。例如,您有一个新用户注册表单,他们在其中输入一些个人信息并选择他们的身份验证凭据。他们必须选择用户名和安全密码,但提供银行帐户信息是可选的。尽管如此,您要确保这些可选字段(如果输入)仍然有效,但以不同的方式显示其错误。

实现此行为的过程包括两个步骤:

  1. 对验证约束应用不同的错误级别;
  2. 根据配置的错误级别自定义您的错误消息。

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 许可获得许可。
目录
    版本