The PropertyInfo Component

The PropertyInfo component allows you to get information about class properties by using different sources of metadata.

PropertyInfo コンポーネントを使用すると、さまざまなメタデータ ソースを使用して、クラス プロパティに関する情報を取得できます。

While the PropertyAccess component allows you to read and write values to/from objects and arrays, the PropertyInfo component works solely with class definitions to provide information about the data type and visibility - including via getter or setter methods - of the properties within that class.

PropertyAccess コンポーネントを使用すると、オブジェクトおよび配列との間で値を読み書きできますが、PropertyInfo コンポーネントは、クラス定義のみを使用して、そのクラス内のプロパティのデータ型および可視性に関する情報を提供します (ゲッター メソッドまたはセッター メソッドを介した場合を含む)。

Installation

1
$ composer require symfony/property-info

Note

ノート

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

このコンポーネントを Symfony アプリケーションの外部にインストールする場合は、Composer が提供するクラス自動ロード メカニズムを有効にするために、コード内に vendor/autoload.php ファイルを必要とする必要があります。詳細については、この記事をお読みください。

Additional dependencies may be required for some of the extractors provided with this component.

このコンポーネントで提供される一部のエクストラクターには、追加の依存関係が必要になる場合があります。

Usage

To use this component, create a new PropertyInfoExtractor instance and provide it with a set of information extractors:

このコンポーネントを使用するには、newPropertyInfoExtractor インスタンスを作成し、一連の情報エクストラクタを提供します。
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
27
28
29
30
31
32
33
34
35
use Example\Namespace\YourAwesomeCoolClass;
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;

// a full list of extractors is shown further below
$phpDocExtractor = new PhpDocExtractor();
$reflectionExtractor = new ReflectionExtractor();

// list of PropertyListExtractorInterface (any iterable)
$listExtractors = [$reflectionExtractor];

// list of PropertyTypeExtractorInterface (any iterable)
$typeExtractors = [$phpDocExtractor, $reflectionExtractor];

// list of PropertyDescriptionExtractorInterface (any iterable)
$descriptionExtractors = [$phpDocExtractor];

// list of PropertyAccessExtractorInterface (any iterable)
$accessExtractors = [$reflectionExtractor];

// list of PropertyInitializableExtractorInterface (any iterable)
$propertyInitializableExtractors = [$reflectionExtractor];

$propertyInfo = new PropertyInfoExtractor(
    $listExtractors,
    $typeExtractors,
    $descriptionExtractors,
    $accessExtractors,
    $propertyInitializableExtractors
);

// see below for more examples
$class = YourAwesomeCoolClass::class;
$properties = $propertyInfo->getProperties($class);

Extractor Ordering

The order of extractor instances within an array matters: the first non-null result will be returned. That is why you must provide each category of extractors as a separate array, even if an extractor provides information for more than one category.

配列内の抽出インスタンスの順序は重要です。最初の null 以外の結果が返されます。そのため、エクストラクタが複数のカテゴリの情報を提供する場合でも、エクストラクタの各カテゴリを個別の配列として提供する必要があります。

For example, while the ReflectionExtractor and DoctrineExtractor both provide list and type information it is probably better that:

たとえば、ReflectionExtractor と DoctrineExtractor の両方がリストと型の情報を提供しますが、おそらく次のことをお勧めします。
  • The ReflectionExtractor has priority for list information so that all properties in a class (not just mapped properties) are returned.
    ReflectionExtractor は、クラス内のすべてのプロパティ (マップされたプロパティだけでなく) が返されるように、リスト情報の優先順位を持っています。
  • The DoctrineExtractor has priority for type information so that entity metadata is used instead of type-hinting to provide more accurate type information:

    DoctrineExtractor は型情報の優先順位を持っているため、より正確な型情報を提供するために型ヒントの代わりにエンティティ メタデータが使用されます。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor;
    use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
    use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
    
    $reflectionExtractor = new ReflectionExtractor();
    $doctrineExtractor = new DoctrineExtractor(/* ... */);
    
    $propertyInfo = new PropertyInfoExtractor(
        // List extractors
        [
            $reflectionExtractor,
            $doctrineExtractor
        ],
        // Type extractors
        [
            $doctrineExtractor,
            $reflectionExtractor
        ]
    );

Extractable Information

The PropertyInfoExtractor class exposes public methods to extract several types of information:

PropertyInfoExtractor クラスは、いくつかの種類の情報を抽出するパブリック メソッドを公開します。

Note

ノート

Be sure to pass a class name, not an object to the extractor methods:

オブジェクトではなく、必ずクラス名を抽出メソッドに渡します。
1
2
3
4
5
6
7
// bad! It may work, but not with all extractors
$propertyInfo->getProperties($awesomeObject);

// Good!
$propertyInfo->getProperties(get_class($awesomeObject));
$propertyInfo->getProperties('Example\Namespace\YourAwesomeClass');
$propertyInfo->getProperties(YourAwesomeClass::class);

List Information

Extractors that implement PropertyListExtractorInterface provide the list of properties that are available on a class as an array containing each property name as a string:

PropertyListExtractorInterface を実装するエクストラクタは、クラスで使用可能なプロパティのリストを、各プロパティ名を文字列として含む配列として提供します。
1
2
3
4
5
6
7
8
9
10
$properties = $propertyInfo->getProperties($class);
/*
    Example Result
    --------------
    array(3) {
        [0] => string(8) "username"
        [1] => string(8) "password"
        [2] => string(6) "active"
    }
*/

Type Information

Extractors that implement PropertyTypeExtractorInterface provide extensive data type information for a property:

PropertyTypeExtractorInterface を実装するエクストラクタは、プロパティの広範なデータ型情報を提供します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$types = $propertyInfo->getTypes($class, $property);
/*
    Example Result
    --------------
    array(1) {
        [0] =>
            class Symfony\Component\PropertyInfo\Type (6) {
            private $builtinType          => string(6) "string"
            private $nullable             => bool(false)
            private $class                => NULL
            private $collection           => bool(false)
            private $collectionKeyType    => NULL
            private $collectionValueType  => NULL
        }
    }
*/

See The PropertyInfo Component for info about the Type class.

Type クラスについては、PropertyInfo コンポーネントを参照してください。

Description Information

Extractors that implement PropertyDescriptionExtractorInterface provide long and short descriptions from a properties annotations as strings:

PropertyDescriptionExtractorInterface を実装するエクストラクタは、プロパティ アノテーションから長い説明と短い説明を文字列として提供します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$title = $propertyInfo->getShortDescription($class, $property);
/*
    Example Result
    --------------
    string(41) "This is the first line of the DocComment."
*/

$paragraph = $propertyInfo->getLongDescription($class, $property);
/*
    Example Result
    --------------
    string(79):
        This is the subsequent paragraph in the DocComment.
        It can span multiple lines.
*/

Access Information

Extractors that implement PropertyAccessExtractorInterface provide whether properties are readable or writable as booleans:

PropertyAccessExtractorInterface を実装するエクストラクタは、プロパティが読み取り可能か書き込み可能かをブール値として提供します。
1
2
3
4
5
$propertyInfo->isReadable($class, $property);
// Example Result: bool(true)

$propertyInfo->isWritable($class, $property);
// Example Result: bool(false)

The ReflectionExtractor looks for getter/isser/setter/hasser method in addition to whether or not a property is public to determine if it's accessible. This based on how the PropertyAccess works.

ReflectionExtractor は、プロパティがパブリックかどうかに加えて、getter/isser/setter/hasser メソッドを検索して、アクセス可能かどうかを判断します。これは、PropertyAccess の仕組みに基づいています。

Property Initializable Information

Extractors that implement PropertyInitializableExtractorInterface provide whether properties are initializable through the class's constructor as booleans:

PropertyInitializableExtractorInterface を実装するエクストラクタは、プロパティがクラスのコンストラクタを介してブール値として初期化可能かどうかを指定します。
1
2
$propertyInfo->isInitializable($class, $property);
// Example Result: bool(true)

isInitializable() returns true if a constructor's parameter of the given class matches the given property name.

isInitializable() は、指定されたクラスのコンストラクターのパラメーターが指定されたプロパティ名と一致する場合に true を返します。

Tip

ヒント

The main PropertyInfoExtractor class implements all interfaces, delegating the extraction of property information to the extractors that have been registered with it.

メインの PropertyInfoExtractor クラスはすべてのインターフェイスを実装し、プロパティ情報の抽出をそれに登録されているエクストラクタに委譲します。

This means that any method available on each of the extractors is also available on the main PropertyInfoExtractor class.

つまり、各エクストラクタで使用できるメソッドは、メインの PropertyInfoExtractor クラスでも使用できます。

Type Objects

Compared to the other extractors, type information extractors provide much more information than can be represented as simple scalar values. Because of this, type extractors return an array of Type objects for each type that the property supports.

他のエクストラクタと比較して、型情報エクストラクタは、単純なスカラー値として表現できるよりもはるかに多くの情報を提供します。このため、型エクストラクタは、プロパティがサポートする型ごとに Type オブジェクトの配列を返します。

For example, if a property supports both integer and string (via the @return int|string annotation), PropertyInfoExtractor::getTypes() will return an array containing two instances of the Type class.

たとえば、プロパティが (@return int|string アノテーションを使用して) 整数と文字列の両方をサポートしている場合、PropertyInfoExtractor::getTypes() は Typeclass の 2 つのインスタンスを含む配列を返します。

Note

ノート

Most extractors will return only one Type instance. The PhpDocExtractor is currently the only extractor that returns multiple instances in the array.

ほとんどのエクストラクタは Typeinstance を 1 つだけ返します。 PhpDocExtractoris は現在、配列内の複数のインスタンスを返す唯一のエクストラクターです。

Each object will provide 6 attributes, available in the 6 methods:

各オブジェクトは、6 つのメソッドで使用できる 6 つの属性を提供します。

Type::getBuiltInType()

The Type::getBuiltinType() method returns the built-in PHP data type, which can be one of these string values: array, bool, callable, float, int, iterable, null, object, resource or string.

Type::getBuiltinType() メソッドは、組み込みの PHP データ型を返します。これは、array、bool、callable、float、int、iterable、null、object、resource、または string のいずれかの文字列値になります。

Constants inside the Type class, in the form Type::BUILTIN_TYPE_*, are provided for convenience.

Type::BUILTIN_TYPE_* の形式の Typeclass 内の定数は、便宜上提供されています。

Type::isNullable()

The Type::isNullable() method will return a boolean value indicating whether the property parameter can be set to null.

Type::isNullable() メソッドは、プロパティ パラメータを null に設定できるかどうかを示すブール値を返します。

Type::getClassName()

If the built-in PHP data type is object, the Type::getClassName() method will return the fully-qualified class or interface name accepted.

組み込みの PHP データ型がオブジェクトの場合、Type::getClassName() メソッドは、受け入れられた完全修飾クラスまたはインターフェース名を返します。

Type::isCollection()

The Type::isCollection() method will return a boolean value indicating if the property parameter is a collection - a non-scalar value capable of containing other values. Currently this returns true if:

Type::isCollection() メソッドは、プロパティ パラメーターがコレクションであるかどうかを示すブール値 (他の値を含むことができる非スカラー値) を返します。現在、this は次の場合に true を返します。
  • The built-in PHP data type is array;
    組み込みの PHP データ型は配列です。
  • The mutator method the property is derived from has a prefix of add or remove (which are defined as the list of array mutator prefixes);
    プロパティの派生元であるミューテーター メソッドには、addor remove というプレフィックスがあります (これは、配列のミューテーター プレフィックスのリストとして定義されます)。
  • The phpDocumentor annotation is of type "collection" (e.g. @var SomeClass<DateTime>, @var SomeClass<integer,string>, @var Doctrine\Common\Collections\Collection<App\Entity\SomeEntity>, etc.)
    phpDocumentor アノテーションは「コレクション」タイプです (例: @var SomeClass、@var SomeClass、@var Doctrine\Common\Collections\Collection など)。

Type::getCollectionKeyTypes() & Type::getCollectionValueTypes()

If the property is a collection, additional type objects may be returned for both the key and value types of the collection (if the information is available), via the Type::getCollectionKeyTypes() and Type::getCollectionValueTypes() methods.

プロパティがコレクションの場合、Type::getCollectionKeyTypes() メソッドと Type::getCollectionValueTypes() メソッドを介して、コレクションのキーと値の両方の型に対して追加の型オブジェクトを返すことができます (情報が利用可能な場合)。

Extractors

The extraction of property information is performed by extractor classes. An extraction class can provide one or more types of property information by implementing the correct interface(s).

プロパティ情報の抽出は、エクストラクタ クラスによって実行されます。抽出クラスは、正しいインターフェイスを実装することにより、1 つまたは複数のタイプのプロパティ情報を提供できます。

The PropertyInfoExtractor will iterate over the relevant extractor classes in the order they were set, call the appropriate method and return the first result that is not null.

PropertyInfoExtractor は、設定された順序で関連するエクストラクタ クラスを繰り返し処理し、適切なメソッドを呼び出して、null でない最初の結果を返します。

While you can create your own extractors, the following are already available to cover most use-cases:

独自のエクストラクターを作成することもできますが、ほとんどのユースケースをカバーするために、次のものが既に利用可能です。

ReflectionExtractor

Using PHP reflection, the ReflectionExtractor provides list, type and access information from setter and accessor methods. It can also give the type of a property (even extracting it from the constructor arguments), and if it is initializable through the constructor. It supports return and scalar types:

PHP リフレクションを使用して、ReflectionExtractor は、setter およびアクセサー メソッドからのリスト、型、およびアクセス情報を提供します。また、プロパティの型 (コンストラクター引数から抽出する場合も含む) を提供し、コンストラクターを介して初期化可能かどうかを指定することもできます。戻り型とスカラー型をサポートしています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;

$reflectionExtractor = new ReflectionExtractor();

// List information.
$reflectionExtractor->getProperties($class);

// Type information.
$reflectionExtractor->getTypes($class, $property);

// Access information.
$reflectionExtractor->isReadable($class, $property);
$reflectionExtractor->isWritable($class, $property);

// Initializable information
$reflectionExtractor->isInitializable($class, $property);

Note

ノート

When using the Symfony framework, this service is automatically registered when the property_info feature is enabled:

Symfony フレームワークを使用している場合、property_info 機能が有効になっていると、このサービスが自動的に登録されます。
1
2
3
4
# config/packages/framework.yaml
framework:
    property_info:
        enabled: true

PhpDocExtractor

Note

ノート

This extractor depends on the phpdocumentor/reflection-docblock library.

このエクストラクタは、phpdocumentor/reflection-docblock ライブラリに依存しています。

Using phpDocumentor Reflection to parse property and method annotations, the PhpDocExtractor provides type and description information. This extractor is automatically registered with the property_info in the Symfony Framework if the dependent library is present:

phpDocumentor Reflection を使用してプロパティとメソッドの注釈を解析し、PhpDocExtractor は型と説明の情報を提供します。このエクストラクタは、依存ライブラリが存在する場合、Symfony フレームワークの property_info に自動的に登録されます。
1
2
3
4
5
6
7
8
9
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;

$phpDocExtractor = new PhpDocExtractor();

// Type information.
$phpDocExtractor->getTypes($class, $property);
// Description information.
$phpDocExtractor->getShortDescription($class, $property);
$phpDocExtractor->getLongDescription($class, $property);

PhpStanExtractor

Note

ノート

This extractor depends on the phpstan/phpdoc-parser and phpdocumentor/reflection-docblock libraries.

このエクストラクタは、phpstan/phpdoc-parser および phpdocumentor/reflection-docblock ライブラリに依存しています。

This extractor fetches information thanks to the PHPStan parser. It gathers information from annotations of properties and methods, such as @var, @param or @return:

このエクストラクタは、PHPStan パーサーのおかげで情報を取得します。 @var、@param、@return などのプロパティとメソッドの注釈から情報を収集します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Domain/Foo.php
class Foo
{
    private $bar;

    /**
     * @param string $bar
     */
    public function __construct($bar) {
        $this->bar = $bar;
    }
}

// Extraction.php
use Symfony\Component\PropertyInfo\Extractor\PhpStanExtractor;

$phpStanExtractor = new PhpStanExtractor();
$phpStanExtractor->getTypesFromConstructor(Foo::class, 'bar');

6.1

6.1

The PhpStanExtractor was introduced in Symfony 6.1.

PhpStanExtractor は Symfony 6.1 で導入されました。

SerializerExtractor

Note

This extractor depends on the symfony/serializer library.

このエクストラクターは symfony/serializer ライブラリに依存しています。

Using groups metadata from the Serializer component, the SerializerExtractor provides list information. This extractor is not registered automatically with the property_info service in the Symfony Framework:

Serializer コンポーネントのグループ メタデータを使用して、SerializerExtractor はリスト情報を提供します。このエクストラクターは、Symfony フレームワークの property_info サービスに自動的に登録されません:
1
2
3
4
5
6
7
8
9
10
11
12
use Doctrine\Common\Annotations\AnnotationReader;
use Symfony\Component\PropertyInfo\Extractor\SerializerExtractor;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;

$serializerClassMetadataFactory = new ClassMetadataFactory(
    new AnnotationLoader(new AnnotationReader)
);
$serializerExtractor = new SerializerExtractor($serializerClassMetadataFactory);

// the `serializer_groups` option must be configured (may be set to null)
$serializerExtractor->getProperties($class, ['serializer_groups' => ['mygroup']]);

If serializer_groups is set to null, serializer groups metadata won't be checked but you will get only the properties considered by the Serializer Component (notably the @Ignore annotation is taken into account).

serializer_groups が null に設定されている場合、シリアライザー グループのメタデータはチェックされませんが、SerializerComponent によって考慮されるプロパティのみが取得されます (特に @Ignore アノテーションが考慮されます)。

DoctrineExtractor

Note

ノート

This extractor depends on the symfony/doctrine-bridge and doctrine/orm libraries.

このエクストラクターは、symfony/doctrine-bridge および doctrine/ormlibraries に依存しています。

Using entity mapping data from Doctrine ORM, the DoctrineExtractor provides list and type information. This extractor is not registered automatically with the property_info service in the Symfony Framework:

Doctrine ORM からのエンティティ マッピング データを使用して、DoctrineExtractor はリストと型情報を提供します。このエクストラクターは、Symfony フレームワークの property_info サービスに自動的に登録されません:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Tools\Setup;
use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor;

$config = Setup::createAnnotationMetadataConfiguration([__DIR__], true);
$entityManager = EntityManager::create([
    'driver' => 'pdo_sqlite',
    // ...
], $config);
$doctrineExtractor = new DoctrineExtractor($entityManager);

// List information.
$doctrineExtractor->getProperties($class);
// Type information.
$doctrineExtractor->getTypes($class, $property);

Creating Your Own Extractors

You can create your own property information extractors by creating a class that implements one or more of the following interfaces: PropertyAccessExtractorInterface, PropertyDescriptionExtractorInterface, PropertyListExtractorInterface, PropertyTypeExtractorInterface and PropertyInitializableExtractorInterface.

次のインターフェイスの 1 つ以上を実装するクラスを作成することにより、独自のプロパティ情報エクストラクタを作成できます。

If you have enabled the PropertyInfo component with the FrameworkBundle, you can automatically register your extractor class with the property_info service by defining it as a service with one or more of the following tags:

FrameworkBundle で PropertyInfo コンポーネントを有効にしている場合は、次のタグの 1 つ以上を使用してサービスとして定義することにより、エクストラクター クラスを property_infoservice に自動的に登録できます。
  • property_info.list_extractor if it provides list information.
    リスト情報を提供する場合は、property_info.list_extractor。
  • property_info.type_extractor if it provides type information.
    タイプ情報を提供する場合は、property_info.type_extractor。
  • property_info.description_extractor if it provides description information.
    説明情報を提供する場合は、property_info.description_extractor。
  • property_info.access_extractor if it provides access information.
    アクセス情報を提供する場合は、property_info.access_extractor。
  • property_info.initializable_extractor if it provides initializable information (it checks if a property can be initialized through the constructor).
    property_info.initializable_extractor が初期化可能な情報を提供する場合 (コンストラクターを介してプロパティを初期化できるかどうかを確認します)。