Collection

This constraint is used when the underlying data is a collection (i.e. an array or an object that implements Traversable and ArrayAccess), but you'd like to validate different keys of that collection in different ways. For example, you might validate the email key using the Email constraint and the inventory key of the collection with the Range constraint.

この制約は、基になるデータがコレクション (つまり、Traversable および ArrayAccess を実装する配列またはオブジェクト) である場合に使用されますが、そのコレクションの異なるキーを異なる方法で検証したい場合に使用されます。たとえば、Email 制約を使用して電子メール キーを検証し、Rangeconstraint を使用してコレクションのインベントリ キーを検証できます。

This constraint can also make sure that certain collection keys are present and that extra keys are not present.

この制約により、特定のコレクション キーが存在し、余分なキーが存在しないことも確認できます。

See also

こちらもご覧ください

If you want to validate that all the elements of the collection are unique use the Unique constraint.

コレクションのすべての要素が一意であることを検証する場合は、Unique 制約を使用します。

Basic Usage

The Collection constraint allows you to validate the different keys of a collection individually. Take the following example:

Collection 制約を使用すると、コレクションのさまざまなキーを個別に検証できます。次の例を見てください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/Entity/Author.php
namespace App\Entity;

class Author
{
    protected $profileData = [
        'personal_email' => '...',
        'short_bio' => '...',
    ];

    public function setProfileData($key, $value)
    {
        $this->profileData[$key] = $value;
    }
}

To validate that the personal_email element of the profileData array property is a valid email address and that the short_bio element is not blank but is no longer than 100 characters in length, you would do the following:

profileData 配列プロパティの personal_email 要素が有効な電子メール アドレスであること、および short_bio 要素が空白ではなく、長さが 100 文字を超えていないことを検証するには、次のようにします。
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

// IMPORTANT: nested attributes requires PHP 8.1 or higher
class Author
{
    #[Assert\Collection(
        fields: [
            'personal_email' => new Assert\Email,
            'short_bio' => [
                new Assert\NotBlank,
                new Assert\Length(
                    max: 100,
                    maxMessage: 'Your short bio is too long!'
                )
            ]
        ],
        allowMissingFields: true,
    )]
    protected $profileData = [
        'personal_email' => '...',
        'short_bio' => '...',
    ];
}

Presence and Absence of Fields

By default, this constraint validates more than whether or not the individual fields in the collection pass their assigned constraints. In fact, if any keys of a collection are missing or if there are any unrecognized keys in the collection, validation errors will be thrown.

デフォルトでは、この制約は、コレクション内の個々のフィールドが割り当てられた制約に合格するかどうか以外にも検証を行います。実際、コレクションのキーが欠落している場合、またはコレクションに認識されていないキーがある場合、検証エラーがスローされます。

If you would like to allow for keys to be absent from the collection or if you would like "extra" keys to be allowed in the collection, you can modify the allowMissingFields and allowExtraFields options respectively. In the above example, the allowMissingFields option was set to true, meaning that if either of the personal_email or short_bio elements were missing from the $personalData property, no validation error would occur.

コレクションにキーが存在しないことを許可する場合、またはコレクションで「余分な」キーを許可する場合は、allowMissingFields および allowExtraFields オプションをそれぞれ変更できます。上記の例では、allowMissingFields オプションが true に設定されています。つまり、personal_email または short_bio 要素のいずれかが $personalData プロパティから欠落している場合、検証エラーは発生しません。

Required and Optional Field Constraints

Constraints for fields within a collection can be wrapped in the Required or Optional constraint to control whether they should always be applied (Required) or only applied when the field is present (Optional).

コレクション内のフィールドの制約を Required または Optional 制約でラップして、常に適用する (必須) か、フィールドが存在する場合にのみ適用する (オプション) かを制御できます。

For instance, if you want to require that the personal_email field of the profileData array is not blank and is a valid email but the alternate_email field is optional but must be a valid email if supplied, you can do the following:

たとえば、profileData 配列の personal_email フィールドが空白ではなく、有効な電子メールであることを要求したいが、alternate_email フィールドはオプションであり、指定された場合は有効な電子メールでなければならない場合は、次の操作を実行できます。
  • Attributes
    属性
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    #[Assert\Collection(
        fields: [
            'personal_email' => new Assert\Required([
                new Assert\NotBlank,
                new Assert\Email,
            ]),
            'alternate_email' => new Assert\Optional(
                new Assert\Email
            ),
        ],
    )]
    protected $profileData = ['personal_email' => 'email@example.com'];
}

Even without allowMissingFields set to true, you can now omit the alternate_email property completely from the profileData array, since it is Optional. However, if the personal_email field does not exist in the array, the NotBlank constraint will still be applied (since it is wrapped in Required) and you will receive a constraint violation.

allowMissingFields を true に設定しなくても、alternate_email プロパティを profileData 配列から完全に省略できるようになりました。 )、制約違反が発生します。

When you define groups in nested constraints they are automatically added to the Collection constraint itself so it can be traversed for all nested groups. Take the following example:

ネストされた制約でグループを定義すると、コレクション制約自体に自動的に追加されるため、すべてのネストされたグループをトラバースできます。次の例を見てください。
1
2
3
4
5
6
7
8
use Symfony\Component\Validator\Constraints as Assert;

$constraint = new Assert\Collection([
    'fields' => [
        'name' => new Assert\NotBlank(['groups' => 'basic']),
        'email' => new Assert\NotBlank(['groups' => 'contact']),
    ],
]);

This will result in the following configuration:

これにより、次の構成になります。
1
2
3
4
5
6
7
8
9
10
11
12
13
$constraint = new Assert\Collection([
    'fields' => [
        'name' => new Assert\Required([
            'constraints' => new Assert\NotBlank(['groups' => 'basic']),
            'groups' => ['basic', 'strict'],
        ]),
        'email' => new Assert\Required([
            "constraints" => new Assert\NotBlank(['groups' => 'contact']),
            'groups' => ['basic', 'strict'],
        ]),
    ],
    'groups' => ['basic', 'strict'],
]);

The default allowMissingFields option requires the fields in all groups. So when validating in contact group, $name can be empty but the key is still required. If this is not the intended behavior, use the Optional constraint explicitly instead of Required.

デフォルトの allowMissingFields オプションでは、すべてのグループのフィールドが必要です。そのため、連絡先グループで検証する場合、$name は空にすることができますが、キーは引き続き必要です。これが意図した動作でない場合は、Required の代わりに Optionalconstraint を明示的に使用してください。

Options

allowExtraFields

type: boolean default: false

タイプ: ブール デフォルト: false

If this option is set to false and the underlying collection contains one or more elements that are not included in the fields option, a validation error will be returned. If set to true, extra fields are OK.

このオプションが false に設定されていて、基になるコレクションにフィールド オプションに含まれていない要素が 1 つ以上含まれている場合、検証エラーが返されます。 true に設定すると、追加のフィールドは問題ありません。

allowMissingFields

type: boolean default: false

タイプ: ブール デフォルト: false

If this option is set to false and one or more fields from the fields option are not present in the underlying collection, a validation error will be returned. If set to true, it's OK if some fields in the fields option are not present in the underlying collection.

このオプションが false に設定されていて、fields オプションの 1 つ以上のフィールドが基になるコレクションに存在しない場合、検証エラーが返されます。 true に設定すると、fieldsoption の一部のフィールドが基になるコレクションに存在しなくても問題ありません。

extraFieldsMessage

type: string default: This field was not expected.

タイプ: 文字列 デフォルト: このフィールドは予期されていませんでした。

The message shown if allowExtraFields is false and an extra field is detected.

allowExtraFields が false で、余分なフィールドが検出された場合に表示されるメッセージ。

You can use the following parameters in this message:

このメッセージでは、次のパラメーターを使用できます。
Parameter Description
{{ field }} The key of the extra field detected

fields

type: array [default option]

タイプ: 配列 [デフォルト オプション]

This option is required and is an associative array defining all of the keys in the collection and, for each key, exactly which validator(s) should be executed against that element of the collection.

このオプションは必須であり、コレクション内のすべてのキーを定義する連想配列であり、キーごとに、コレクションのその要素に対して実行するバリデーターを正確に定義します。

groups

type: array | string

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

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

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

missingFieldsMessage

type: string default: This field is missing.

タイプ: 文字列 デフォルト: このフィールドはありません。

The message shown if allowMissingFields is false and one or more fields are missing from the underlying collection.

allowMissingFields が false で、基になるコレクションに 1 つ以上のフィールドがない場合に表示されるメッセージ。

You can use the following parameters in this message:

このメッセージでは、次のパラメーターを使用できます。
Parameter Description
{{ field }} The key of the missing field defined in fields

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.

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