Callback

The purpose of the Callback constraint is to create completely custom validation rules and to assign any validation errors to specific fields on your object. If you're using validation with forms, this means that instead of displaying custom errors at the top of the form, you can display them next to the field they apply to.

Callback 制約の目的は、完全にカスタムの検証ルールを作成し、検証エラーをオブジェクトの特定のフィールドに割り当てることです。フォームで検証を使用している場合、これは、カスタム エラーをフォームの上部に表示する代わりに、適用されるフィールドの横に表示できることを意味します。

This process works by specifying one or more callback methods, each of which will be called during the validation process. Each of those methods can do anything, including creating and assigning validation errors.

このプロセスは、検証プロセス中に呼び出される 1 つ以上のコールバック メソッドを指定することによって機能します。これらの各メソッドは、検証エラーの作成や割り当てなど、あらゆることを実行できます。

Note

ノート

A callback method itself doesn't fail or return any value. Instead, as you'll see in the example, a callback method has the ability to directly add validator "violations".

コールバック メソッド自体が失敗したり、値を返したりすることはありません。代わりに、例でわかるように、コールバック メソッドにはバリデータの「違反」を直接追加する機能があります。
Applies to class or property/method
Class Callback
Validator CallbackValidator

Configuration

  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Author
{
    #[Assert\Callback]
    public function validate(ExecutionContextInterface $context, $payload)
    {
        // ...
    }
}

The Callback Method

The callback method is passed a special ExecutionContextInterface object. You can set "violations" directly on this object and determine to which field those errors should be attributed:

コールバック メソッドには、特別な ExecutionContextInterface オブジェクトが渡されます。このオブジェクトに「違反」を直接設定して、これらのエラーの原因を特定するフィールドを決定できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ...
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Author
{
    // ...
    private $firstName;

    public function validate(ExecutionContextInterface $context, $payload)
    {
        // somehow you have an array of "fake names"
        $fakeNames = [/* ... */];

        // check if the name is actually a fake name
        if (in_array($this->getFirstName(), $fakeNames)) {
            $context->buildViolation('This name sounds totally fake!')
                ->atPath('firstName')
                ->addViolation();
        }
    }
}

Static Callbacks

You can also use the constraint with static methods. Since static methods don't have access to the object instance, they receive the object as the first argument:

静的メソッドで制約を使用することもできます。静的メソッドはオブジェクト インスタンスにアクセスできないため、最初の引数としてオブジェクトを受け取ります。
1
2
3
4
5
6
7
8
9
10
11
12
13
public static function validate($object, ExecutionContextInterface $context, $payload)
{
    // somehow you have an array of "fake names"
    $fakeNames = [/* ... */];

    // check if the name is actually a fake name
    if (in_array($object->getFirstName(), $fakeNames)) {
        $context->buildViolation('This name sounds totally fake!')
            ->atPath('firstName')
            ->addViolation()
        ;
    }
}

External Callbacks and Closures

If you want to execute a static callback method that is not located in the class of the validated object, you can configure the constraint to invoke an array callable as supported by PHP's call_user_func function. Suppose your validation function is Acme\Validator::validate():

検証済みオブジェクトのクラスにない静的なコールバック メソッドを実行したい場合は、PHP の call_user_func 関数でサポートされている呼び出し可能な配列を呼び出すように制約を構成できます。検証関数が Acme\Validator::validate() であるとします。
1
2
3
4
5
6
7
8
9
10
11
namespace Acme;

use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Validator
{
    public static function validate($object, ExecutionContextInterface $context, $payload)
    {
        // ...
    }
}

You can then use the following configuration to invoke this validator:

次に、次の構成を使用してこのバリデータを呼び出すことができます。
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
// src/Entity/Author.php
namespace App\Entity;

use Acme\Validator;
use Symfony\Component\Validator\Constraints as Assert;

#[Assert\Callback([Validator::class, 'validate'])]
class Author
{
}

Note

ノート

The Callback constraint does not support global callback functions nor is it possible to specify a global function or a service method as a callback. To validate using a service, you should create a custom validation constraint and add that new constraint to your class.

Callback 制約は、グローバル コールバック関数をサポートしておらず、グローバル関数またはサービス メソッドをコールバックとして指定することもできません。サービスを使用して検証するには、カスタム検証制約を作成し、その新しい制約をクラスに追加する必要があります。

When configuring the constraint via PHP, you can also pass a closure to the constructor of the Callback constraint:

PHP を介して制約を構成する場合、 Callback 制約のコンストラクターにクロージャーを渡すこともできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class Author
{
    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $callback = function ($object, ExecutionContextInterface $context, $payload) {
            // ...
        };

        $metadata->addConstraint(new Assert\Callback($callback));
    }
}

Warning

警告

Using a Closure together with attribute configuration will disable the attribute cache for that class/property/method because Closure cannot be cached. For best performance, it's recommended to use a static callback method.

Closure を属性構成と一緒に使用すると、Closure をキャッシュできないため、そのクラス/プロパティ/メソッドの属性キャッシュが無効になります。最高のパフォーマンスを得るには、静的なコールバック メソッドを使用することをお勧めします。

Options

callback

type: string, array or Closure [default option]

タイプ: 文字列、配列、クロージャ [デフォルト オプション]

The callback option accepts three different formats for specifying the callback method:

コールバック オプションは、コールバック メソッドを指定するための 3 つの異なる形式を受け入れます。
  • A string containing the name of a concrete or static method;
    具体的または静的メソッドの名前を含む文字列。
  • An array callable with the format ['<Class>', '<method>'];
    ['', ''] の形式で呼び出し可能な配列。
  • A closure.
    閉鎖。

Concrete callbacks receive an ExecutionContextInterface instance as only argument.

具体的なコールバックは、唯一の引数として ExecutionContextInterface インスタンスを受け取ります。

Static or closure callbacks receive the validated object as the first argument and the ExecutionContextInterface instance as the second argument.

静的コールバックまたはクロージャー コールバックは、検証済みのオブジェクトを最初の引数として受け取り、ExecutionContextInterface インスタンスを 2 番目の引数として受け取ります。

groups

type: array | string

タイプ: 配列 |ストリング

It defines the validation group or groups of this constraint. Read more about validation groups.

この制約の検証グループを定義します。検証グループの詳細を参照してください。

payload

type: mixed default: null

タイプ: 混合 デフォルト: null

This option can be used to attach arbitrary domain-specific data to a constraint. The configured payload is not used by the Validator component, but its processing is completely up to you.

このオプションは、任意のドメイン固有のデータを制約に添付するために使用できます。構成されたペイロードは Validator コンポーネントによって使用されませんが、その処理は完全にユーザー次第です。

For example, you may want to use several error levels to present failed constraints differently in the front-end depending on the severity of the error.

たとえば、いくつかのエラー レベルを使用して、エラーの重大度に応じて、失敗した制約をフロントエンドで異なる方法で提示することができます。