エンティティフックを実装し、 Computed Field FieldType plugins で定義されたすべてのフィールドを操作したいと思います。そのため、モジュールが提供するすべてのFieldTypeプラグインのリストが必要か、どのフィールドを操作する(または回避する)かを知るために、それに関連付けられているフィールドを知る必要があります。これは可能ですか?
プラグイン(_computed_string
_、_computed_decimal
_など)のリストをハードコード化したくないのは、後で新しいプラグインを追加して、リストを変更する必要があるためです。
そして、別のモジュールである計算フィールドプラグイン が独自のフィールドタイプをその接頭辞 で定義しているため、_computed_*
_を使用できず、触れたくないそれ。
FieldDefinitionInterface :: getDefiningModule()
のようなものが期待されていましたが、それは存在しないようです。
関心のある方のために、 計算されたカーディナリティのサポートの追加に取り組んでいます .
質問のタイトルへの答えは簡単です。 getProvider()
を介してプラグインから拡張機能を取得できます。したがって、すべてのFieldTypeプラグインのリストを作成するか、プラグイン定義から特定のフィールドタイプのプロバイダーを直接取得できます。
$module = \Drupal::service('plugin.manager.field.field_type')
->getDefinition($field_type)['provider'];
フィールド定義の場合、これはもう少し複雑です。フィールドストレージにもこのメソッドがありますが、構成済みフィールドの場合は常にモジュールfield
を返します。これはあなたが望むものではありません。しかし、別の場所があります。フィールドストレージを作成する場合、フィールドタイププラグインのプロバイダーは、プロパティmodule
に格納されます。したがって、FieldDefinitionInterfaceから始めて、モジュール名を取得できるはずです。
$module = $field_definition->getFieldStorageDefinition()->get('module');