Loading Resources

The Validator component uses metadata to validate a value. This metadata defines how a class, array or any other value should be validated. When validating a class, the metadata is defined by the class itself. When validating simple values, the metadata must be passed to the validation methods.

Validator コンポーネントは、メタデータを使用して値を検証します。このメタデータ定義は、クラス、配列、またはその他の値を検証する必要があることを示しています。クラスを検証するとき、メタデータはクラス自体によって定義されます。単純な値を検証する場合、メタデータを検証メソッドに渡す必要があります。

Class metadata can be defined in a configuration file or in the class itself. The Validator component collects that metadata using a set of loaders.

クラス メタデータは、構成ファイルまたはクラス自体で定義できます。Validator コンポーネントは、一連のローダーを使用してそのメタデータを収集します。

See also

こちらもご覧ください

You'll learn how to define the metadata in Metadata.

メタデータでメタデータを定義する方法を学習します。

The StaticMethodLoader

The most basic loader is the StaticMethodLoader. This loader gets the metadata by calling a static method of the class. The name of the method is configured using the addMethodMapping() method of the validator builder:

最も基本的なローダーは、StaticMethodLoader です。このローダーは、クラスの静的メソッドを呼び出してメタデータを取得します。メソッドの名前は、バリデータ ビルダーの addMethodMapping() メソッドを使用して構成されます。
1
2
3
4
5
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->addMethodMapping('loadValidatorMetadata')
    ->getValidator();

In this example, the validation metadata is retrieved executing the loadValidatorMetadata() method of the class:

この例では、クラスの loadValidatorMetadata() メソッドを実行して検証メタデータを取得します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Mapping\ClassMetadata;

class User
{
    protected $name;

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new Assert\NotBlank());
        $metadata->addPropertyConstraint('name', new Assert\Length([
            'min' => 5,
            'max' => 20,
        ]));
    }
}

Tip

ヒント

Instead of calling addMethodMapping() multiple times to add several method names, you can also use addMethodMappings() to set an array of supported method names.

addMethodMapping() を複数回呼び出して複数のメソッド名を追加する代わりに、addMethodMappings() を使用して、サポートされているメソッド名の配列を設定することもできます。

The File Loaders

The component also provides two file loaders, one to load YAML files and one to load XML files. Use addYamlMapping() or addXmlMapping() to configure the locations of these files:

このコンポーネントは、2 つのファイル ローダーも提供します。1 つは YAML ファイルをロードするためのもので、もう 1 つは XML ファイルをロードするためのものです。これらのファイルの場所を設定するには、addYamlMapping() または addXmlMapping() を使用します。
1
2
3
4
5
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->addYamlMapping('validator/validation.yaml')
    ->getValidator();

Note

ノート

If you want to load YAML mapping files, then you will also need to install the Yaml component.

YAML マッピング ファイルをロードする場合は、YAML コンポーネントもインストールする必要があります。

Tip

ヒント

Just like with the method mappings, you can also use addYamlMappings() and addXmlMappings() to configure an array of file paths.

メソッド マッピングと同様に、addYamlMappings() と addXmlMappings() を使用してファイル パスの配列を構成することもできます。

The AnnotationLoader

At last, the component provides an AnnotationLoader to get the metadata from the annotations of the class. Annotations are defined as @ prefixed classes included in doc block comments (/** ... */). For example:

最後に、コンポーネントは AnnotationLoader を提供して、クラスのアノテーションからメタデータを取得します。注釈は、doc ブロック コメント (/** ... */) に含まれる @prefixed クラスとして定義されます。例えば:
1
2
3
4
5
6
7
8
9
10
use Symfony\Component\Validator\Constraints as Assert;
// ...

class User
{
    /**
     * @Assert\NotBlank
     */
    protected $name;
}

To enable the annotation loader, call the enableAnnotationMapping() method. If you use annotations instead of attributes, it's also required to call addDefaultDoctrineAnnotationReader() to use Doctrine's annotation reader:

注釈ローダーを有効にするには、enableAnnotationMapping() メソッドを呼び出します。属性の代わりに注釈を使用する場合は、Doctrine の注釈リーダーを使用するために addDefaultDoctrineAnnotationReader() も呼び出す必要があります。
1
2
3
4
5
6
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping()
    ->addDefaultDoctrineAnnotationReader() // add this only when using annotations
    ->getValidator();

To disable the annotation loader after it was enabled, call disableAnnotationMapping().

アノテーションローダーを有効にした後で無効にするには、disableAnnotationMapping() を呼び出します。

Note

ノート

In order to use the annotation loader, you should have installed the doctrine/annotations and doctrine/cache packages with Composer.

注釈ローダーを使用するには、Doctrine/annotations および doctrine/cache パッケージを Composer とともにインストールする必要があります。

Tip

ヒント

Annotation classes aren't loaded automatically, so you must load them using a class loader like this:

アノテーション クラスは自動的にロードされないため、次のようなクラス ローダーを使用してロードする必要があります。
1
2
3
4
5
6
7
8
9
use Composer\Autoload\ClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;

/** @var ClassLoader $loader */
$loader = require __DIR__.'/../vendor/autoload.php';

AnnotationRegistry::registerLoader([$loader, 'loadClass']);

return $loader;

Using Multiple Loaders

The component provides a LoaderChain class to execute several loaders sequentially in the same order they were defined:

このコンポーネントは、定義された順序で複数のローダーを順次実行する LoaderChain クラスを提供します。

The ValidatorBuilder will already take care of this when you configure multiple mappings:

複数のマッピングを構成する場合、ValidatorBuilder は既にこれを処理します。
1
2
3
4
5
6
7
8
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->enableAnnotationMapping(true)
    ->addDefaultDoctrineAnnotationReader()
    ->addMethodMapping('loadValidatorMetadata')
    ->addXmlMapping('validator/validation.xml')
    ->getValidator();

Caching

Using many loaders to load metadata from different places is convenient, but it can slow down your application because each file needs to be parsed, validated and converted into a ClassMetadata instance.

多くのローダーを使用してさまざまな場所からメタデータをロードすると便利ですが、各ファイルを解析、検証、および ClassMetadata インスタンスに変換する必要があるため、アプリケーションが遅くなる可能性があります。

To solve this problem, call the setMappingCache() method of the Validator builder and pass your own caching class (which must implement the PSR-6 interface CacheItemPoolInterface):

この問題を解決するには、Validator ビルダーの setMappingCache() メソッドを呼び出し、独自のキャッシュ クラスを渡します (PSR-6 インターフェイス CacheItemPoolInterface を実装する必要があります)。
1
2
3
4
5
6
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    // ... add loaders
    ->setMappingCache(new SomePsr6Cache())
    ->getValidator();

Note

ノート

The loaders already use a singleton load mechanism. That means that the loaders will only load and parse a file once and put that in a property, which will then be used the next time it is asked for metadata. However, the Validator still needs to merge all metadata of one class from every loader when it is requested.

ローダーはすでにシングルトン ロード メカニズムを使用しています。これは、ローダーがファイルを 1 回だけロードして解析し、それをプロパティに配置することを意味します。これは、次にメタデータを要求されたときに使用されます。ただし、バリデーターは、要求されたときにすべてのローダーから 1 つのクラスのすべてのメタデータをマージする必要があります。

Using a Custom MetadataFactory

All the loaders and the cache are passed to an instance of LazyLoadingMetadataFactory. This class is responsible for creating a ClassMetadata instance from all the configured resources.

すべてのローダーとキャッシュは、LazyLoadingMetadataFactory のインスタンスに渡されます。このクラスは、構成されたすべてのリソースから ClassMetadata インスタンスを作成する役割を果たします。

You can also use a custom metadata factory implementation by creating a class which implements MetadataFactoryInterface. You can set this custom implementation using setMetadataFactory():

また、MetadataFactoryInterface を実装するクラスを作成して、カスタム メタデータ ファクトリ実装を使用することもできます。setMetadataFactory() を使用して、このカスタム実装を設定できます。
1
2
3
4
5
6
use Acme\Validation\CustomMetadataFactory;
use Symfony\Component\Validator\Validation;

$validator = Validation::createValidatorBuilder()
    ->setMetadataFactory(new CustomMetadataFactory(...))
    ->getValidator();

Caution

注意

Since you are using a custom metadata factory, you can't configure loaders and caches using the add*Mapping() methods anymore. You now have to inject them into your custom metadata factory yourself.

カスタム メタデータ ファクトリを使用しているため、add*Mapping() メソッドを使用してローダーとキャッシュを構成することはできなくなりました。カスタム メタデータ ファクトリに自分で注入する必要があります。