diff --git a/modules/ui_patterns_devel/tests/src/Kernel/TwigValidatorTestBase.php b/modules/ui_patterns_devel/tests/src/Kernel/TwigValidatorTestBase.php index 33dad29295a182465190a49cc91d32559a3cb622..d0f83a320058333d9d83c27d272cc8950c98d429 100644 --- a/modules/ui_patterns_devel/tests/src/Kernel/TwigValidatorTestBase.php +++ b/modules/ui_patterns_devel/tests/src/Kernel/TwigValidatorTestBase.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace Drupal\Tests\ui_patterns_devel\Kernel; +use Drupal\Core\Theme\ComponentPluginManager; use Drupal\Tests\Core\Theme\Component\ComponentKernelTestBase; -use Drupal\ui_patterns\ComponentPluginManager; use Drupal\ui_patterns_devel\TwigValidator\TwigValidator; /** diff --git a/modules/ui_patterns_devel/tests/src/Kernel/ValidatorTest.php b/modules/ui_patterns_devel/tests/src/Kernel/ValidatorTest.php index bb53f30a2736c86a28602750a9e1129a7b4e80cf..af9462d8608f12ae5a9c4bd2266c311dcb76cccb 100644 --- a/modules/ui_patterns_devel/tests/src/Kernel/ValidatorTest.php +++ b/modules/ui_patterns_devel/tests/src/Kernel/ValidatorTest.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace Drupal\Tests\ui_patterns_devel\Kernel; +use Drupal\Core\Theme\ComponentPluginManager; use Drupal\Tests\Core\Theme\Component\ComponentKernelTestBase; -use Drupal\ui_patterns\ComponentPluginManager; use Drupal\ui_patterns_devel\DefinitionValidator; use Drupal\ui_patterns_devel\TwigValidator\TwigValidator; use Drupal\ui_patterns_devel\Validator; diff --git a/modules/ui_patterns_field_formatters/src/Plugin/Field/FieldFormatter/ComponentFormatterBase.php b/modules/ui_patterns_field_formatters/src/Plugin/Field/FieldFormatter/ComponentFormatterBase.php index abeb167e0d39c5ea1b7d0a6ab4d9411e00ca19eb..9783aa7d9ae917dd7f1c8aacfd7ebd0178fb1207 100644 --- a/modules/ui_patterns_field_formatters/src/Plugin/Field/FieldFormatter/ComponentFormatterBase.php +++ b/modules/ui_patterns_field_formatters/src/Plugin/Field/FieldFormatter/ComponentFormatterBase.php @@ -11,6 +11,7 @@ use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\Context\Context; use Drupal\Core\Plugin\Context\ContextDefinition; use Drupal\Core\Plugin\Context\EntityContext; +use Drupal\Core\Theme\ComponentPluginManager; use Drupal\ui_patterns\Form\ComponentSettingsFormBuilderTrait; use Drupal\ui_patterns\Plugin\Context\RequirementsContext; use Drupal\ui_patterns\SourcePluginBase; @@ -26,9 +27,9 @@ abstract class ComponentFormatterBase extends FormatterBase { /** * The component plugin manager. * - * @var \Drupal\ui_patterns\ComponentPluginManager + * @var \Drupal\Core\Theme\ComponentPluginManager */ - protected $componentPluginManager; + protected ComponentPluginManager $componentPluginManager; /** * The entity type manager. diff --git a/modules/ui_patterns_layouts/src/Plugin/Derivative/ComponentLayout.php b/modules/ui_patterns_layouts/src/Plugin/Derivative/ComponentLayout.php index e5123e127fff6f5e5f7402416fdff99ec8345df8..41c47bceecee594eaaf2ca0bedc803c697b8ae44 100644 --- a/modules/ui_patterns_layouts/src/Plugin/Derivative/ComponentLayout.php +++ b/modules/ui_patterns_layouts/src/Plugin/Derivative/ComponentLayout.php @@ -8,7 +8,7 @@ use Drupal\Core\Extension\ThemeHandlerInterface; use Drupal\Core\Layout\LayoutDefinition; use Drupal\Core\Plugin\Context\ContextDefinition; use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface; -use Drupal\ui_patterns\ComponentPluginManager; +use Drupal\Core\Theme\ComponentPluginManager; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem; use Symfony\Component\Filesystem\Path; @@ -23,7 +23,7 @@ class ComponentLayout extends DeriverBase implements ContainerDeriverInterface { /** * Constructs new ComponentLayout Deriver. * - * @param \Drupal\ui_patterns\ComponentPluginManager $pluginManager + * @param \Drupal\Core\Theme\ComponentPluginManager $pluginManager * The component plugin manager. * @param \Drupal\Core\Extension\ModuleHandlerInterface $moduleHandler * The module handler. @@ -48,7 +48,9 @@ class ComponentLayout extends DeriverBase implements ContainerDeriverInterface { * {@inheritdoc} */ public function getDerivativeDefinitions($base_plugin_definition) { + /* @phpstan-ignore method.notFound */ $components = $this->pluginManager->getSortedDefinitions(); + foreach ($components as $component) { $component_instance = $this->pluginManager->find($component['id']); /** @var \Drupal\Core\Layout\LayoutDefinition $base_plugin_definition */ diff --git a/modules/ui_patterns_layouts/tests/src/Kernel/SourcesDeriverTest.php b/modules/ui_patterns_layouts/tests/src/Kernel/SourcesDeriverTest.php index 48b0cc852abcb10788c80ec7d93f4d96986a7d05..148b13db46bfc2054cf8cf440fdfa8435c8a5d11 100644 --- a/modules/ui_patterns_layouts/tests/src/Kernel/SourcesDeriverTest.php +++ b/modules/ui_patterns_layouts/tests/src/Kernel/SourcesDeriverTest.php @@ -34,7 +34,7 @@ class SourcesDeriverTest extends SourcePluginsTestBase { /** * The component plugin manager. * - * @var \Drupal\ui_patterns\ComponentPluginManager + * @var \Drupal\Core\Theme\ComponentPluginManager */ protected $componentManager; @@ -51,6 +51,7 @@ class SourcesDeriverTest extends SourcePluginsTestBase { * Tests creating fields of all types on a content type. */ public function testDerivedPluginPerComponent() { + /* @phpstan-ignore method.notFound */ $components = $this->componentManager->getSortedDefinitions(); foreach ($components as $component) { $component_instance = $this->componentManager->find($component['id']); diff --git a/src/ComponentPluginManager.php b/src/ComponentPluginManager.php index dc83d9cc01ebb754506e307ca29e716df23e0754..0fc0d6c2584fddfb9e2bbb7d98bec2e047a11564 100644 --- a/src/ComponentPluginManager.php +++ b/src/ComponentPluginManager.php @@ -8,7 +8,6 @@ use Drupal\Component\Plugin\CategorizingPluginManagerInterface; use Drupal\Component\Plugin\Definition\PluginDefinitionInterface; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Config\ConfigFactoryInterface; -use Drupal\Core\Extension\ModuleExtensionList; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Extension\ThemeHandlerInterface; use Drupal\Core\File\FileSystemInterface; @@ -17,6 +16,7 @@ use Drupal\Core\Theme\Component\ComponentValidator; use Drupal\Core\Theme\Component\SchemaCompatibilityChecker; use Drupal\Core\Theme\ComponentNegotiator; use Drupal\Core\Theme\ComponentPluginManager as SdcPluginManager; +use Drupal\Core\Theme\ComponentPluginManager as CoreComponentPluginManager; use Drupal\Core\Theme\ThemeManagerInterface; use Drupal\ui_patterns\SchemaManager\ReferencesResolver; @@ -26,12 +26,48 @@ use Drupal\ui_patterns\SchemaManager\ReferencesResolver; class ComponentPluginManager extends SdcPluginManager implements CategorizingPluginManagerInterface { /** - * Cache key prefix to use in the cache backend. + * The prop type plugin manager. */ - const CACHE_KEY = 'ui_patterns'; + protected PropTypePluginManager $propTypePluginManager; /** - * {@inheritdoc} + * The prop type adapter plugin manager. + */ + protected PropTypeAdapterPluginManager $propTypeAdapterPluginManager; + + /** + * The reference resolver. + */ + protected CoreComponentPluginManager $componentPluginManager; + + /** + * The reference resolver. + */ + protected ReferencesResolver $referencesSolver; + + /** + * Constructs ComponentPluginManager object. + * + * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + * The module handler. + * @param \Drupal\Core\Extension\ThemeHandlerInterface $themeHandler + * The theme handler. + * @param \Drupal\Core\Cache\CacheBackendInterface $cacheBackend + * Cache backend instance to use. + * @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory + * The configuration factory. + * @param \Drupal\Core\Theme\ThemeManagerInterface $themeManager + * The theme manager. + * @param \Drupal\Core\Theme\ComponentNegotiator $componentNegotiator + * The component negotiator. + * @param \Drupal\Core\File\FileSystemInterface $fileSystem + * The file system service. + * @param \Drupal\Core\Theme\Component\SchemaCompatibilityChecker $compatibilityChecker + * The compatibility checker. + * @param \Drupal\Core\Theme\Component\ComponentValidator $componentValidator + * The component validator. + * @param string $appRoot + * The application root. */ public function __construct( ModuleHandlerInterface $module_handler, @@ -44,10 +80,6 @@ class ComponentPluginManager extends SdcPluginManager implements CategorizingPlu SchemaCompatibilityChecker $compatibilityChecker, ComponentValidator $componentValidator, string $appRoot, - protected PropTypePluginManager $propTypePluginManager, - protected PropTypeAdapterPluginManager $prop_type_adapterPluginManager, - protected ReferencesResolver $referencesSolver, - ModuleExtensionList $moduleExtensionList, ) { parent::__construct( $module_handler, @@ -59,17 +91,37 @@ class ComponentPluginManager extends SdcPluginManager implements CategorizingPlu $fileSystem, $compatibilityChecker, $componentValidator, - $appRoot - ); - $this->moduleExtensionList = $moduleExtensionList; + $appRoot); $this->alterInfo('component_info'); - $this->setCacheBackend($cacheBackend, self::CACHE_KEY); + $this->setCacheBackend($cacheBackend, 'component_plugins'); + } + + /** + * Sets the prop type plugin manager. + */ + public function setPropTypePluginManager(PropTypePluginManager $propTypePluginManager): void { + $this->propTypePluginManager = $propTypePluginManager; + } + + /** + * Sets the prop type adapter plugin manager. + */ + public function setPropTypePluginAdapter(PropTypeAdapterPluginManager $propTypeAdapterPluginManager): void { + $this->propTypeAdapterPluginManager = $propTypeAdapterPluginManager; + } + + /** + * Sets reference resolver. + */ + public function setReferenceSolver(ReferencesResolver $referencesSolver): void { + $this->referencesSolver = $referencesSolver; } /** * {@inheritdoc} */ protected function alterDefinition(array $definition): array { + // Overriding SDC alterDefinition method. $definition = parent::alterDefinition($definition); // Adding custom logic. @@ -163,7 +215,7 @@ class ComponentPluginManager extends SdcPluginManager implements CategorizingPlu // the compatibility checker, but close enough to address the same // sources as an existing prop type with only some small unidirectional // transformation of the data. So, we need an adapter plugin. - $prop_type_adapter = $this->prop_type_adapterPluginManager->guessFromSchema($prop); + $prop_type_adapter = $this->propTypeAdapterPluginManager->guessFromSchema($prop); if ($prop_type_adapter) { $prop_type_id = $prop_type_adapter->getPropTypeId(); $prop_type = $this->propTypePluginManager->createInstance($prop_type_id); diff --git a/src/Element/ComponentForm.php b/src/Element/ComponentForm.php index ec3a35a782f33d9152841957028790e26a7d0a23..223017ddfe283ad72eabd8a4ced78f8a3e857664 100644 --- a/src/Element/ComponentForm.php +++ b/src/Element/ComponentForm.php @@ -207,6 +207,7 @@ class ComponentForm extends ComponentFormBase { ?string $wrapper_id, ?string $selected_component_id, ): array { + /* @phpstan-ignore method.notFound */ $definitions = \Drupal::service("plugin.manager.sdc")->getGroupedDefinitions(); $options = []; foreach ($definitions as $group_id => $group) { diff --git a/tests/src/Kernel/ComponentPluginManagerTest.php b/tests/src/Kernel/ComponentPluginManagerTest.php index 3a32c4aa5249d8abef3c51e881a0115e8b572d25..e07e47c7e4080b07773d4f2bebeed581c7588e17 100644 --- a/tests/src/Kernel/ComponentPluginManagerTest.php +++ b/tests/src/Kernel/ComponentPluginManagerTest.php @@ -4,8 +4,8 @@ declare(strict_types=1); namespace Drupal\Tests\ui_patterns\Kernel; +use Drupal\Core\Theme\ComponentPluginManager; use Drupal\KernelTests\KernelTestBase; -use Drupal\ui_patterns\ComponentPluginManager; /** * Test the ComponentPluginManager service. @@ -31,7 +31,7 @@ final class ComponentPluginManagerTest extends KernelTestBase { /** * The component plugin manager from ui_patterns. * - * @var \Drupal\ui_patterns\ComponentPluginManager + * @var \Drupal\Core\Theme\ComponentPluginManager */ protected ComponentPluginManager $manager; @@ -55,6 +55,7 @@ final class ComponentPluginManagerTest extends KernelTestBase { * @covers ::getCategories */ public function testGetCategories() : void { + /* @phpstan-ignore method.notFound */ $categories = $this->manager->getCategories(); $this->assertNotEmpty($categories); } @@ -63,6 +64,7 @@ final class ComponentPluginManagerTest extends KernelTestBase { * @covers ::getSortedDefinitions */ public function testGetSortedDefinitions(): void { + /* @phpstan-ignore method.notFound */ $sortedDefinitions = $this->manager->getSortedDefinitions(); $this->assertNotEmpty($sortedDefinitions); } @@ -71,6 +73,7 @@ final class ComponentPluginManagerTest extends KernelTestBase { * @covers ::getGroupedDefinitions */ public function testGetGroupedDefinitions(): void { + /* @phpstan-ignore method.notFound */ $groupedDefinitions = $this->manager->getGroupedDefinitions(); $this->assertNotEmpty($groupedDefinitions); } diff --git a/tests/src/Traits/RunSourcePluginTestTrait.php b/tests/src/Traits/RunSourcePluginTestTrait.php index 4384ed36ec37b63b70a39314dd4c7233dcf63dc4..d44153f7a492efd96276783042c68cc3fabd7aac 100644 --- a/tests/src/Traits/RunSourcePluginTestTrait.php +++ b/tests/src/Traits/RunSourcePluginTestTrait.php @@ -4,7 +4,7 @@ namespace Drupal\Tests\ui_patterns\Traits; use Drupal\Core\Plugin\Context\Context; use Drupal\Core\Plugin\Context\ContextDefinition; -use Drupal\ui_patterns\ComponentPluginManager; +use Drupal\Core\Theme\ComponentPluginManager; use Drupal\ui_patterns\SourcePluginBase; use Drupal\ui_patterns\SourcePluginManager; use function PHPUnit\Framework\assertNotNull; diff --git a/ui_patterns.services.yml b/ui_patterns.services.yml index 593f10246a27be5dcc66fbb7aab491a982d0e57e..e089a47a9aa51cee79dabdcda64ebce5cd30201b 100644 --- a/ui_patterns.services.yml +++ b/ui_patterns.services.yml @@ -1,22 +1,14 @@ services: # Plugins managers. - plugin.manager.sdc: - class: Drupal\ui_patterns\ComponentPluginManager - arguments: - - "@module_handler" - - "@theme_handler" - - "@cache.discovery" - - "@config.factory" - - "@theme.manager" - - '@Drupal\Core\Theme\ComponentNegotiator' - - "@file_system" - - '@Drupal\Core\Theme\Component\SchemaCompatibilityChecker' - - '@Drupal\Core\Theme\Component\ComponentValidator' - - "%app.root%" - - "@plugin.manager.ui_patterns_prop_type" - - "@plugin.manager.ui_patterns_prop_type_adapter" - - "@ui_patterns.schema_reference_solver" - - "@extension.list.module" + + Drupal\ui_patterns\ComponentPluginManager: + decorates: plugin.manager.sdc + parent: plugin.manager.sdc + decoration_priority: 0 + calls: + - [ setPropTypePluginManager, [ '@plugin.manager.ui_patterns_prop_type' ] ] + - [ setPropTypePluginAdapter, [ '@plugin.manager.ui_patterns_prop_type_adapter' ] ] + - [ setReferenceSolver, [ '@ui_patterns.schema_reference_solver' ] ] plugin.manager.ui_patterns_prop_type: class: Drupal\ui_patterns\PropTypePluginManager parent: default_plugin_manager