composer = $composer; $this->io = $io; } /** * Returns an array of event names this subscriber wants to listen to. */ public static function getSubscribedEvents() { return [ ScriptEvents::POST_INSTALL_CMD => "processPackages", ScriptEvents::POST_UPDATE_CMD => "processPackages", ]; } /** * @param Event $event * @throws \Exception */ public function processPackages(Event $event) { $extenderManager = new ExtenderManager(); $composer = $event->getComposer(); $installationManager = $composer->getInstallationManager(); $repositoryManager = $composer->getRepositoryManager(); $localRepository = $repositoryManager->getLocalRepository(); foreach ($localRepository->getPackages() as $package) { if ($installationManager->isPackageInstalled($localRepository, $package)) { if ($package->getType() === 'drupal-console-library') { $extenderManager->addServicesFile($installationManager->getInstallPath($package) . '/console.services.yml'); $extenderManager->addConfigFile($installationManager->getInstallPath($package) . '/console.config.yml'); } } } if ($consolePackage = $localRepository->findPackage('drupal/console', '*')) { if ($localRepository->hasPackage($consolePackage)) { $directory = $installationManager->getInstallPath($consolePackage); } } if (empty($directory)) { // cwd should be the project root. This is the same logic Symfony uses. $directory = getcwd(); } $configFile = $directory . '/extend.console.config.yml'; $servicesFile = $directory . '/extend.console.services.yml'; $servicesUninstallFile = $directory . '/extend.console.uninstall.services.yml'; if (file_exists($configFile)) { unlink($configFile); $this->io->write('Removing config cache file:'); $this->io->write($configFile); } if (file_exists($servicesFile)) { unlink($servicesFile); $this->io->write('Removing packages services cache file:'); $this->io->write($servicesFile); } if (file_exists($servicesUninstallFile)) { unlink($servicesUninstallFile); $this->io->write('Removing packages services cache file:'); $this->io->write($servicesUninstallFile); } if ($configData = $extenderManager->getConfigData()) { file_put_contents( $configFile, Yaml::dump($configData, 6, 2) ); $this->io->write('Creating packages config cache file:'); $this->io->write($configFile); } $servicesData = $extenderManager->getServicesData(); if ($servicesData && array_key_exists('install', $servicesData)) { file_put_contents( $servicesFile, Yaml::dump($servicesData['install'], 4, 2) ); $this->io->write('Creating packages services cache file: '); $this->io->write($servicesFile); } $servicesData = $extenderManager->getServicesData(); if ($servicesData && array_key_exists('uninstall', $servicesData)) { file_put_contents( $servicesUninstallFile, Yaml::dump($servicesData['uninstall'], 4, 2) ); $this->io->write('Creating packages services cache file: '); $this->io->write($servicesUninstallFile); } $this->removeCacheFiles($directory); } protected function removeCacheFiles($directory) { try { $finder = new Finder(); $finder->files() ->in($directory) ->name('*-console.services.yml') ->ignoreUnreadableDirs(); foreach ($finder as $file) { $this->io->write('Removing site services cache file:'); $this->io->write($file->getPathName()); unlink($file->getPathName()); } } catch (\InvalidArgumentException $argumentException) { $this->io->write('Cache file can not be deleted'); } } }