How to Handle Different Error Levels

Sometimes, you may want to display constraint validation error messages differently based on some rules. For example, you have a registration form for new users where they enter some personal information and choose their authentication credentials. They would have to choose a username and a secure password, but providing bank account information would be optional. Nonetheless, you want to make sure that these optional fields, if entered, are still valid, but display their errors differently.

ルールによっては、制約の検証エラー メッセージを別の方法で表示したい場合があります。たとえば、新しいユーザーが個人情報を入力し、認証資格情報を選択するための登録フォームがあるとします。ユーザー名と安全なパスワードを選択する必要がありますが、銀行口座情報の提供は任意です。それにもかかわらず、これらのオプションのフィールドが入力された場合でも有効であることを確認したいのですが、エラーの表示は異なります。

The process to achieve this behavior consists of two steps:

この動作を実現するプロセスは、次の 2 つの手順で構成されます。
  1. Apply different error levels to the validation constraints;
    検証制約にさまざまなエラー レベルを適用します。
  2. Customize your error messages depending on the configured error level.
    構成されたエラー レベルに応じて、エラー メッセージをカスタマイズします。

1. Assigning the Error Level

Use the payload option to configure the error level for each constraint:

ペイロード オプションを使用して、各制約のエラー レベルを構成します。
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
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 $username;

    #[Assert\NotBlank(payload: ['severity' => 'error'])]
    protected $password;

    #[Assert\Iban(payload: ['severity' => 'warning'])]
    protected $bankAccountNumber;
}

2. Customize the Error Message Template

When validation of the User object fails, you can retrieve the constraint that caused a particular failure using the getConstraint() method. Each constraint exposes the attached payload as a public property:

User オブジェクトの検証が失敗した場合、getConstraint() メソッドを使用して、特定の失敗の原因となった制約を取得できます。各制約は、添付されたペイロードをパブリック プロパティとして公開します。
1
2
3
4
5
// a constraint validation failure, instance of
// Symfony\Component\Validator\ConstraintViolation
$constraintViolation = ...;
$constraint = $constraintViolation->getConstraint();
$severity = $constraint->payload['severity'] ?? null;

For example, you can leverage this to customize the form_errors block so that the severity is added as an additional HTML class:

たとえば、これを利用して 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 -%}

See also

こちらもご覧ください

For more information on customizing form rendering, see How to Customize Form Rendering.

フォーム レンダリングのカスタマイズの詳細については、「フォーム レンダリングをカスタマイズする方法」を参照してください。