Version 1
[yaffs-website] / vendor / drupal / console / src / Bootstrap / AddServicesCompilerPass.php
1 <?php
2
3 namespace Drupal\Console\Bootstrap;
4
5 use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
6 use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
7 use Symfony\Component\DependencyInjection\ContainerBuilder;
8 use Symfony\Component\Config\FileLocator;
9 use Symfony\Component\Finder\Finder;
10 use Symfony\Component\Yaml\Yaml;
11 use Drupal\Console\Utils\TranslatorManager;
12 use Drupal\Console\Extension\Extension;
13 use Drupal\Console\Extension\Manager;
14
15 /**
16  * FindCommandsCompilerPass
17  */
18 class AddServicesCompilerPass implements CompilerPassInterface
19 {
20     /**
21      * @var string
22      */
23     protected $root;
24
25     /**
26      * @var string
27      */
28     protected $appRoot;
29
30     /**
31      * @var boolean
32      */
33     protected $rebuild;
34
35     /**
36      * AddCommandsCompilerPass constructor.
37      *
38      * @param string  $root
39      * @param string  $appRoot
40      * @param boolean $rebuild
41      */
42     public function __construct($root, $appRoot, $rebuild = false)
43     {
44         $this->root = $root;
45         $this->appRoot = $appRoot;
46         $this->rebuild = $rebuild;
47     }
48
49     /**
50      * @inheritdoc
51      */
52     public function process(ContainerBuilder $container)
53     {
54         $loader = new YamlFileLoader(
55             $container,
56             new FileLocator($this->root)
57         );
58
59         $loader->load($this->root. DRUPAL_CONSOLE_CORE . 'services.yml');
60         $loader->load($this->root. DRUPAL_CONSOLE . 'services-drupal-install.yml');
61         $loader->load($this->root. DRUPAL_CONSOLE . 'services.yml');
62
63         $container->get('console.configuration_manager')
64             ->loadConfiguration($this->root)
65             ->getConfiguration();
66
67         $cacheDirectory = $container->get('console.site')->getCacheDirectory();
68         $consoleServicesFile = $cacheDirectory.'/console.services.yml';
69
70         if (!$this->rebuild && file_exists($consoleServicesFile)) {
71             $loader->load($consoleServicesFile);
72         } else {
73             if (file_exists($consoleServicesFile)) {
74                 unlink($consoleServicesFile);
75             }
76             $finder = new Finder();
77             $finder->files()
78                 ->name('*.yml')
79                 ->in(
80                     sprintf(
81                         '%s/config/services/drupal-console',
82                         $this->root.DRUPAL_CONSOLE
83                     )
84                 );
85
86             $servicesData = [];
87             foreach ($finder as $file) {
88                 $loader->load($file->getPathName());
89                 $servicesData = $this->extractServiceData(
90                     $file->getPathName(),
91                     $servicesData
92                 );
93             }
94
95             /**
96              * @var Manager $extensionManager
97              */
98             $extensionManager = $container->get('console.extension_manager');
99             /**
100              * @var Extension[] $modules
101              */
102             $modules = $extensionManager->discoverModules()
103                 ->showCore()
104                 ->showNoCore()
105                 ->showInstalled()
106                 ->getList(false);
107
108             foreach ($modules as $module) {
109                 if ($module->origin == 'core') {
110                     $consoleServicesExtensionFile = $this->root . DRUPAL_CONSOLE .
111                         'config/services/drupal-core/'.$module->getName().'.yml';
112                     if (is_file($consoleServicesExtensionFile)) {
113                         $loader->load($consoleServicesExtensionFile);
114                         $servicesData = $this->extractServiceData(
115                             $consoleServicesExtensionFile,
116                             $servicesData
117                         );
118                     }
119                 }
120
121                 $consoleServicesExtensionFile = $this->appRoot . '/' .
122                     $module->getPath() . '/console.services.yml';
123                 if (is_file($consoleServicesExtensionFile)) {
124                     $loader->load($consoleServicesExtensionFile);
125                     $servicesData = $this->extractServiceData(
126                         $consoleServicesExtensionFile,
127                         $servicesData
128                     );
129                 }
130             }
131
132             /**
133              * @var Extension[] $themes
134              */
135             $themes = $extensionManager->discoverThemes()
136                 ->showNoCore()
137                 ->showInstalled()
138                 ->getList(false);
139
140             foreach ($themes as $theme) {
141                 $consoleServicesExtensionFile = $this->appRoot . '/' .
142                     $theme->getPath() . '/console.services.yml';
143                 if (is_file($consoleServicesExtensionFile)) {
144                     $loader->load($consoleServicesExtensionFile);
145                     $servicesData = $this->extractServiceData(
146                         $consoleServicesExtensionFile,
147                         $servicesData
148                     );
149                 }
150             }
151
152             if ($servicesData && is_writable($cacheDirectory)) {
153                 file_put_contents(
154                     $consoleServicesFile,
155                     Yaml::dump($servicesData, 4, 2)
156                 );
157             }
158         }
159
160         $consoleExtendServicesFile = $this->root. DRUPAL_CONSOLE .'/extend.console.services.yml';
161         if (file_exists($consoleExtendServicesFile)) {
162             $loader->load($consoleExtendServicesFile);
163         }
164
165         $configurationManager = $container->get('console.configuration_manager');
166         $directory = $configurationManager->getConsoleDirectory() . 'extend/';
167         $autoloadFile = $directory . 'vendor/autoload.php';
168         if (is_file($autoloadFile)) {
169             include_once $autoloadFile;
170             $extendServicesFile = $directory . 'extend.console.services.yml';
171             if (is_file($extendServicesFile)) {
172                 $loader->load($extendServicesFile);
173             }
174         }
175
176         $container->setParameter(
177             'console.service_definitions',
178             $container->getDefinitions()
179         );
180
181         $definition = $container->getDefinition('console.translator_manager');
182         $definition->setClass(TranslatorManager::class);
183     }
184
185     /**
186      * @param $filePath
187      * @param $servicesData
188      *
189      * @return array
190      */
191     protected function extractServiceData($filePath, $servicesData)
192     {
193         $serviceFileData = Yaml::parse(
194             file_get_contents($filePath)
195         );
196
197         $servicesData = array_merge_recursive(
198             $servicesData,
199             $serviceFileData
200         );
201
202         return $servicesData;
203     }
204 }