Version 1
[yaffs-website] / vendor / drupal / console / src / Bootstrap / AddServicesCompilerPass.php
diff --git a/vendor/drupal/console/src/Bootstrap/AddServicesCompilerPass.php b/vendor/drupal/console/src/Bootstrap/AddServicesCompilerPass.php
new file mode 100644 (file)
index 0000000..e86f85d
--- /dev/null
@@ -0,0 +1,204 @@
+<?php
+
+namespace Drupal\Console\Bootstrap;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Finder\Finder;
+use Symfony\Component\Yaml\Yaml;
+use Drupal\Console\Utils\TranslatorManager;
+use Drupal\Console\Extension\Extension;
+use Drupal\Console\Extension\Manager;
+
+/**
+ * FindCommandsCompilerPass
+ */
+class AddServicesCompilerPass implements CompilerPassInterface
+{
+    /**
+     * @var string
+     */
+    protected $root;
+
+    /**
+     * @var string
+     */
+    protected $appRoot;
+
+    /**
+     * @var boolean
+     */
+    protected $rebuild;
+
+    /**
+     * AddCommandsCompilerPass constructor.
+     *
+     * @param string  $root
+     * @param string  $appRoot
+     * @param boolean $rebuild
+     */
+    public function __construct($root, $appRoot, $rebuild = false)
+    {
+        $this->root = $root;
+        $this->appRoot = $appRoot;
+        $this->rebuild = $rebuild;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function process(ContainerBuilder $container)
+    {
+        $loader = new YamlFileLoader(
+            $container,
+            new FileLocator($this->root)
+        );
+
+        $loader->load($this->root. DRUPAL_CONSOLE_CORE . 'services.yml');
+        $loader->load($this->root. DRUPAL_CONSOLE . 'services-drupal-install.yml');
+        $loader->load($this->root. DRUPAL_CONSOLE . 'services.yml');
+
+        $container->get('console.configuration_manager')
+            ->loadConfiguration($this->root)
+            ->getConfiguration();
+
+        $cacheDirectory = $container->get('console.site')->getCacheDirectory();
+        $consoleServicesFile = $cacheDirectory.'/console.services.yml';
+
+        if (!$this->rebuild && file_exists($consoleServicesFile)) {
+            $loader->load($consoleServicesFile);
+        } else {
+            if (file_exists($consoleServicesFile)) {
+                unlink($consoleServicesFile);
+            }
+            $finder = new Finder();
+            $finder->files()
+                ->name('*.yml')
+                ->in(
+                    sprintf(
+                        '%s/config/services/drupal-console',
+                        $this->root.DRUPAL_CONSOLE
+                    )
+                );
+
+            $servicesData = [];
+            foreach ($finder as $file) {
+                $loader->load($file->getPathName());
+                $servicesData = $this->extractServiceData(
+                    $file->getPathName(),
+                    $servicesData
+                );
+            }
+
+            /**
+             * @var Manager $extensionManager
+             */
+            $extensionManager = $container->get('console.extension_manager');
+            /**
+             * @var Extension[] $modules
+             */
+            $modules = $extensionManager->discoverModules()
+                ->showCore()
+                ->showNoCore()
+                ->showInstalled()
+                ->getList(false);
+
+            foreach ($modules as $module) {
+                if ($module->origin == 'core') {
+                    $consoleServicesExtensionFile = $this->root . DRUPAL_CONSOLE .
+                        'config/services/drupal-core/'.$module->getName().'.yml';
+                    if (is_file($consoleServicesExtensionFile)) {
+                        $loader->load($consoleServicesExtensionFile);
+                        $servicesData = $this->extractServiceData(
+                            $consoleServicesExtensionFile,
+                            $servicesData
+                        );
+                    }
+                }
+
+                $consoleServicesExtensionFile = $this->appRoot . '/' .
+                    $module->getPath() . '/console.services.yml';
+                if (is_file($consoleServicesExtensionFile)) {
+                    $loader->load($consoleServicesExtensionFile);
+                    $servicesData = $this->extractServiceData(
+                        $consoleServicesExtensionFile,
+                        $servicesData
+                    );
+                }
+            }
+
+            /**
+             * @var Extension[] $themes
+             */
+            $themes = $extensionManager->discoverThemes()
+                ->showNoCore()
+                ->showInstalled()
+                ->getList(false);
+
+            foreach ($themes as $theme) {
+                $consoleServicesExtensionFile = $this->appRoot . '/' .
+                    $theme->getPath() . '/console.services.yml';
+                if (is_file($consoleServicesExtensionFile)) {
+                    $loader->load($consoleServicesExtensionFile);
+                    $servicesData = $this->extractServiceData(
+                        $consoleServicesExtensionFile,
+                        $servicesData
+                    );
+                }
+            }
+
+            if ($servicesData && is_writable($cacheDirectory)) {
+                file_put_contents(
+                    $consoleServicesFile,
+                    Yaml::dump($servicesData, 4, 2)
+                );
+            }
+        }
+
+        $consoleExtendServicesFile = $this->root. DRUPAL_CONSOLE .'/extend.console.services.yml';
+        if (file_exists($consoleExtendServicesFile)) {
+            $loader->load($consoleExtendServicesFile);
+        }
+
+        $configurationManager = $container->get('console.configuration_manager');
+        $directory = $configurationManager->getConsoleDirectory() . 'extend/';
+        $autoloadFile = $directory . 'vendor/autoload.php';
+        if (is_file($autoloadFile)) {
+            include_once $autoloadFile;
+            $extendServicesFile = $directory . 'extend.console.services.yml';
+            if (is_file($extendServicesFile)) {
+                $loader->load($extendServicesFile);
+            }
+        }
+
+        $container->setParameter(
+            'console.service_definitions',
+            $container->getDefinitions()
+        );
+
+        $definition = $container->getDefinition('console.translator_manager');
+        $definition->setClass(TranslatorManager::class);
+    }
+
+    /**
+     * @param $filePath
+     * @param $servicesData
+     *
+     * @return array
+     */
+    protected function extractServiceData($filePath, $servicesData)
+    {
+        $serviceFileData = Yaml::parse(
+            file_get_contents($filePath)
+        );
+
+        $servicesData = array_merge_recursive(
+            $servicesData,
+            $serviceFileData
+        );
+
+        return $servicesData;
+    }
+}