From 0ad328c20170ddaaa5ce894eac430959dce3d736 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke <bfr@qbus.de> Date: Mon, 13 Apr 2020 23:19:43 +0200 Subject: [PATCH] [BUGFIX] Fix PackageManager event binding PackageManager can not have DI tags assigned as it is a early container instance (injected from core Bootstrap). That caused the 'packagesMayHaveChanged' event to never be executed. We rather need to hookup the event listener using a service provider that extends the ListenerProvider. (That's pretty much the same, what the DI tags do in the background as well.) Notes: 1) To avoid similar future mistakes we also remove the unneeded `autoconfigure: false` from Configuration.yaml 2) This restriction (no DI tag configuration) does only apply to early instance services, which is a static list of core TYPO3 services. 3) We additionally drop the currently unused event callback PackageManager::beforeInstallationEventListener. It was not fully migrated to a PSR-14 event callback in #90249, which revealed that it is actually unneeded. The signal callback was introduced with #52766 in EXT:extensionmanager/ext_localconf.php, but became obsolete with later fixes: #71071 and #71455 ExtensionManagementService now calls (through Install/ListUtility) directly into packageManager instead of (mis-)using a signal/event. Resolves: #90955 Related: #90249 Releases: master Change-Id: I8943e6149743d527c9e1157e425eed3afa98b0d4 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64156 Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Simon Gilli <typo3@gilbertsoft.org> Tested-by: Benni Mack <benni@typo3.org> Reviewed-by: Simon Gilli <typo3@gilbertsoft.org> Reviewed-by: Helmut Hummel <typo3@helhum.io> Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de> Reviewed-by: Benni Mack <benni@typo3.org> --- .../sysext/core/Classes/Package/PackageManager.php | 8 -------- typo3/sysext/core/Classes/ServiceProvider.php | 13 +++++++++++++ typo3/sysext/core/Configuration/Services.yaml | 8 -------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php index 294b3664088d..e63846301c25 100644 --- a/typo3/sysext/core/Classes/Package/PackageManager.php +++ b/typo3/sysext/core/Classes/Package/PackageManager.php @@ -21,7 +21,6 @@ use TYPO3\CMS\Core\Cache\Frontend\FrontendInterface; use TYPO3\CMS\Core\Core\ClassLoadingInformation; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Information\Typo3Version; -use TYPO3\CMS\Core\Package\Event\BeforePackageActivationEvent; use TYPO3\CMS\Core\Package\Event\PackagesMayHaveChangedEvent; use TYPO3\CMS\Core\Package\Exception\InvalidPackageKeyException; use TYPO3\CMS\Core\Package\Exception\InvalidPackageManifestException; @@ -316,13 +315,6 @@ class PackageManager implements SingletonInterface $this->scanAvailablePackages(); } - public function beforeInstallationEventListener(BeforePackageActivationEvent $event): void - { - if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_BE) { - $this->scanAvailablePackages(); - } - } - /** * Scans all directories for a certain package. * diff --git a/typo3/sysext/core/Classes/ServiceProvider.php b/typo3/sysext/core/Classes/ServiceProvider.php index fc8a922ec8b2..d5b534ef3c2b 100644 --- a/typo3/sysext/core/Classes/ServiceProvider.php +++ b/typo3/sysext/core/Classes/ServiceProvider.php @@ -53,6 +53,7 @@ class ServiceProvider extends AbstractServiceProvider { return [ EventDispatcherInterface::class => [ static::class, 'provideFallbackEventDispatcher' ], + EventDispatcher\ListenerProvider::class => [ static::class, 'extendEventListenerProvider' ], ] + parent::getExtensions(); } @@ -105,6 +106,18 @@ class ServiceProvider extends AbstractServiceProvider return new EventDispatcher\ListenerProvider($container); } + public static function extendEventListenerProvider( + ContainerInterface $container, + EventDispatcher\ListenerProvider $listenerProvider + ): EventDispatcher\ListenerProvider { + $listenerProvider->addListener( + Package\Event\PackagesMayHaveChangedEvent::class, + Package\PackageManager::class, + 'packagesMayHaveChanged' + ); + return $listenerProvider; + } + public static function getDependencyOrderingService(ContainerInterface $container): Service\DependencyOrderingService { return new Service\DependencyOrderingService(); diff --git a/typo3/sysext/core/Configuration/Services.yaml b/typo3/sysext/core/Configuration/Services.yaml index 4a5291ca131b..2b461c5e4667 100644 --- a/typo3/sysext/core/Configuration/Services.yaml +++ b/typo3/sysext/core/Configuration/Services.yaml @@ -56,14 +56,6 @@ services: arguments: $configPath: "%env(TYPO3:configPath)%/sites" - TYPO3\CMS\Core\Package\PackageManager: - autoconfigure: false - tags: - - name: event.listener - identifier: 'typo3-core' - method: 'packagesMayHaveChanged' - event: TYPO3\CMS\Core\Package\Event\PackagesMayHaveChangedEvent - TYPO3\CMS\Core\Package\FailsafePackageManager: autoconfigure: false -- GitLab