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