diff --cc core/lib/Drupal/Core/Extension/ModuleInstaller.php index a903b8a,d542adc..0000000 --- a/core/lib/Drupal/Core/Extension/ModuleInstaller.php +++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php @@@ -8,6 -8,16 +8,7 @@@ use Drupal\Core\Cache\CacheBackendInter use Drupal\Core\DrupalKernelInterface; use Drupal\Core\Entity\EntityStorageException; use Drupal\Core\Entity\FieldableEntityInterface; + use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Drupal\Core\KeyValueStore\KeyValueFactoryInterface; -use Drupal\Core\Plugin\CachedDiscoveryClearerInterface; -use Drupal\Core\Routing\RouteBuilderInterface; -use Drupal\Core\StreamWrapper\StreamWrapperManager; -use Psr\Log\LoggerInterface; /** * Default implementation of the module installer. @@@ -46,6 -58,76 +47,13 @@@ class ModuleInstaller implements Module protected $uninstallValidators; /** - * The config factory. - * - * @var \Drupal\Core\Config\ConfigFactoryInterface - */ - protected $configFactory; - - /** - * The config installer. - * - * @var \Drupal\Core\Config\ConfigInstallerInterface - */ - protected $configInstaller; - - /** - * The plugin cache clearer. - * - * @var \Drupal\Core\Plugin\CachedDiscoveryClearerInterface - */ - protected $pluginCacheClearer; - - /** - * The route builder. - * - * @var \Drupal\Core\Routing\RouteBuilderInterface - */ - protected $routeBuilder; - - /** - * The stream wrapper manager. - * - * @var \Drupal\Core\StreamWrapper\StreamWrapperManager - */ - protected $streamWrapperManager; - - /** - * The theme handler. - * - * @var \Drupal\Core\Extension\ThemeHandlerInterface - */ - protected $themeHandler; - - /** - * The logger. - * - * @var \Psr\Log\LoggerInterface - */ - protected $logger; - - /** - * The config manager. - * - * @var \Drupal\Core\Config\ConfigManagerInterface - */ - protected $configManager; - - /** - * The key value factory. - * - * @var \Drupal\Core\KeyValueStore\KeyValueFactoryInterface - */ - protected $keyValueFactory; - - /** + * The event dispatcher. + * + * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + protected $eventDispatcher; + + /** * Constructs a new ModuleInstaller instance. * * @param string $root @@@ -54,14 -136,44 +62,17 @@@ * The module handler. * @param \Drupal\Core\DrupalKernelInterface $kernel * The drupal kernel. - * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory - * The config factory. - * @param \Drupal\Core\Config\ConfigInstallerInterface $config_installer - * The config installer. - * @param \Drupal\Core\Plugin\CachedDiscoveryClearerInterface $plugin_cache_clearer - * The plugin cache clearer. - * @param \Drupal\Core\Routing\RouteBuilderInterface $route_builder - * The route builder. - * @param \Drupal\Core\StreamWrapper\StreamWrapperManager $stream_wrapper_manager - * The stream wrapper manager. - * @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler - * The theme handler. - * @param \Psr\Log\LoggerInterface $logger - * The logger. - * @param \Drupal\Core\Config\ConfigManagerInterface $config_manager - * The config manager. - * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory - * The key value factory. + * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher + * The event dispatcher. * * @see \Drupal\Core\DrupalKernel * @see \Drupal\Core\CoreServiceProvider */ - public function __construct($root, ModuleHandlerInterface $module_handler, DrupalKernelInterface $kernel) { - public function __construct($root, ModuleHandlerInterface $module_handler, DrupalKernelInterface $kernel, ConfigFactoryInterface $config_factory, ConfigInstallerInterface $config_installer, CachedDiscoveryClearerInterface $plugin_cache_clearer, RouteBuilderInterface $route_builder, StreamWrapperManager $stream_wrapper_manager, ThemeHandlerInterface $theme_handler, LoggerInterface $logger, ConfigManagerInterface $config_manager, KeyValueFactoryInterface $key_value_factory, EventDispatcherInterface $event_dispatcher) { ++ public function __construct($root, ModuleHandlerInterface $module_handler, DrupalKernelInterface $kernel, EventDispatcherInterface $event_dispatcher) { $this->root = $root; $this->moduleHandler = $module_handler; $this->kernel = $kernel; - $this->configFactory = $config_factory; - $this->configInstaller = $config_installer; - $this->pluginCacheClearer = $plugin_cache_clearer; - $this->routeBuilder = $route_builder; - $this->streamWrapperManager = $stream_wrapper_manager; - $this->themeHandler = $theme_handler; - $this->logger = $logger; - $this->configManager = $config_manager; - $this->keyValueFactory = $key_value_factory; + $this->eventDispatcher = $event_dispatcher; } /** @@@ -207,41 -317,12 +218,13 @@@ $version = max(max($versions), $version); } - // Notify interested components that this module's entity types and - // field storage definitions are new. For example, a SQL-based storage - // handler can use this as an opportunity to create the necessary - // database tables. - // @todo Clean this up in https://www.drupal.org/node/2350111. - $entity_manager = \Drupal::entityManager(); - $update_manager = \Drupal::entityDefinitionUpdateManager(); - foreach ($entity_manager->getDefinitions() as $entity_type) { - if ($entity_type->getProvider() == $module) { - $update_manager->installEntityType($entity_type); - } - elseif ($entity_type->isSubclassOf(FieldableEntityInterface::CLASS)) { - // The module being installed may be adding new fields to existing - // entity types. Field definitions for any entity type defined by - // the module are handled in the if branch. - foreach ($entity_manager->getFieldStorageDefinitions($entity_type->id()) as $storage_definition) { - if ($storage_definition->getProvider() == $module) { - // If the module being installed is also defining a storage key - // for the entity type, the entity schema may not exist yet. It - // will be created later in that case. - try { - $update_manager->installFieldStorageDefinition($storage_definition->getName(), $entity_type->id(), $module, $storage_definition); - } - catch (EntityStorageException $e) { - watchdog_exception('system', $e, 'An error occurred while notifying the creation of the @name field storage definition: "!message" in %function (line %line of %file).', ['@name' => $storage_definition->getName()]); - } - } - } - } - } + $event = new ModuleEvent($module); + $this->eventDispatcher->dispatch(ModuleEvents::MODULE_INSTALLED, $event); // Install default configuration of the module. + $config_installer = \Drupal::service('config.installer'); if ($sync_status) { - $this->configInstaller + $config_installer ->setSyncing(TRUE) ->setSourceStorage($source_storage); } diff --git a/core/core.services.yml b/core/core.services.yml index 1ee07fe..0c55e94 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -478,7 +478,7 @@ services: class: Drupal\Core\Extension\ModuleInstaller tags: - { name: service_collector, tag: 'module_install.uninstall_validator', call: addUninstallValidator } - arguments: ['@app.root', '@module_handler', '@kernel', '@router.builder'] + arguments: ['@app.root', '@module_handler', '@kernel', '@event_dispatcher'] lazy: true content_uninstall_validator: class: Drupal\Core\Entity\ContentUninstallValidator @@ -558,6 +558,11 @@ services: field_definition.listener: class: Drupal\Core\Field\FieldDefinitionListener arguments: ['@entity_type.manager', '@entity_field.manager', '@keyvalue', '@cache.discovery'] + entity.module_install.subscriber: + class: \Drupal\Core\EventSubscriber\ModuleInstallerEntitySubscriber + arguments: ['@entity_type.manager', '@entity_field.manager', '@entity.definition_update_manager'] + tags: + - { name: event_subscriber } entity.form_builder: class: Drupal\Core\Entity\EntityFormBuilder arguments: ['@entity.manager', '@form_builder'] diff --git a/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php index 1dac2ee..d546660 100644 --- a/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php +++ b/core/lib/Drupal/Core/EventSubscriber/ModuleInstallerEntitySubscriber.php @@ -67,9 +67,9 @@ public function onModuleInstall(ModuleEvent $event) { // field storage definitions are new. For example, a SQL-based storage // handler can use this as an opportunity to create the necessary // database tables. - foreach ($this->entityTypeManager->getDefinitions() as $entity_type) { + foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type) { if ($entity_type->getProvider() == $module) { - $this->entityUpdateManager->installEntityType($entity_type); + \Drupal::entityDefinitionUpdateManager()->installEntityType($entity_type); } elseif ($entity_type->isSubclassOf(FieldableEntityInterface::CLASS)) { // The module being installed may be adding new fields to existing @@ -103,9 +103,9 @@ public function onModuleUninstall(ModuleEvent $event) { // Notify interested components that this module's entity types are being // deleted. For example, a SQL-based storage handler can use this as an // opportunity to drop the corresponding database tables. - foreach ($this->entityTypeManager->getDefinitions() as $entity_type) { + foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type) { if ($entity_type->getProvider() == $module) { - $this->entityUpdateManager->uninstallEntityType($entity_type); + \Drupal::entityDefinitionUpdateManager()->uninstallEntityType($entity_type); } elseif ($entity_type->isSubclassOf(FieldableEntityInterface::CLASS)) { // The module being uninstalled may be removing fields from existing