3 namespace Drupal\Console\Utils;
5 use Symfony\Component\DependencyInjection\Reference;
6 use Symfony\Component\Filesystem\Filesystem;
7 use Symfony\Component\Finder\Finder;
8 use Drupal\Core\DependencyInjection\ContainerBuilder;
9 use Drupal\Core\Logger\LoggerChannelFactory;
10 use Drupal\Core\Language\LanguageManager;
11 use Drupal\Core\Language\Language;
12 use Drupal\Core\Site\Settings;
13 use Drupal\Console\Core\Utils\ConfigurationManager;
23 * @var ConfigurationManager
25 protected $configurationManager;
30 protected $cacheDirectory;
35 * @param string $appRoot
36 * @param ConfigurationManager $configurationManager
38 public function __construct(
40 ConfigurationManager $configurationManager
42 $this->appRoot = $appRoot;
43 $this->configurationManager = $configurationManager;
46 public function loadLegacyFile($legacyFile, $relative = true)
49 $legacyFile = realpath(
50 sprintf('%s/%s', $this->appRoot, $legacyFile)
54 if (file_exists($legacyFile)) {
55 include_once $legacyFile;
66 public function getStandardLanguages()
68 $standardLanguages = LanguageManager::getStandardLanguageList();
70 foreach ($standardLanguages as $langcode => $standardLanguage) {
71 $languages[$langcode] = $standardLanguage[0];
80 public function getDatabaseTypes()
82 $this->loadLegacyFile('/core/includes/install.inc');
83 $this->setMinimalContainerPreKernel();
85 $driverDirectories = [
86 $this->appRoot . '/core/lib/Drupal/Core/Database/Driver',
87 $this->appRoot . '/drivers/lib/Drupal/Driver/Database'
90 $driverDirectories = array_filter(
92 function ($directory) {
93 return is_dir($directory);
97 $finder = new Finder();
98 $finder->directories()
99 ->in($driverDirectories)
103 foreach ($finder as $driver_folder) {
104 if (file_exists($driver_folder->getRealpath() . '/Install/Tasks.php')) {
105 $driver = $driver_folder->getBasename();
106 $installer = db_installer_object($driver);
107 // Verify is database is installable
108 if ($installer->installable()) {
109 $reflection = new \ReflectionClass($installer);
110 $install_namespace = $reflection->getNamespaceName();
111 // Cut the trailing \Install from namespace.
112 $driver_class = substr($install_namespace, 0, strrpos($install_namespace, '\\'));
113 $databases[$driver] = ['namespace' => $driver_class, 'name' =>$installer->name()];
121 protected function setMinimalContainerPreKernel()
123 // Create a minimal mocked container to support calls to t() in the pre-kernel
124 // base system verification code paths below. The strings are not actually
125 // used or output for these calls.
126 $container = new ContainerBuilder();
127 $container->setParameter('language.default_values', Language::$defaultValues);
129 ->register('language.default', 'Drupal\Core\Language\LanguageDefault')
130 ->addArgument('%language.default_values%');
132 ->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager')
133 ->addArgument(new Reference('language.default'));
135 // Register the stream wrapper manager.
137 ->register('stream_wrapper_manager', 'Drupal\Core\StreamWrapper\StreamWrapperManager')
138 ->addMethodCall('setContainer', [new Reference('service_container')]);
140 ->register('file_system', 'Drupal\Core\File\FileSystem')
141 ->addArgument(new Reference('stream_wrapper_manager'))
142 ->addArgument(Settings::getInstance())
143 ->addArgument((new LoggerChannelFactory())->get('file'));
145 \Drupal::setContainer($container);
148 public function getDatabaseTypeDriver($driver)
150 // We cannot use Database::getConnection->getDriverClass() here, because
151 // the connection object is not yet functional.
152 $task_class = "Drupal\\Core\\Database\\Driver\\{$driver}\\Install\\Tasks";
153 if (class_exists($task_class)) {
154 return new $task_class();
156 $task_class = "Drupal\\Driver\\Database\\{$driver}\\Install\\Tasks";
157 return new $task_class();
164 public function getAutoload()
166 $autoLoadFile = $this->appRoot.'/autoload.php';
168 return include $autoLoadFile;
174 public function multisiteMode($uri)
176 if ($uri != 'default') {
186 public function validMultisite($uri)
188 $multiSiteFile = sprintf(
189 '%s/sites/sites.php',
193 if (file_exists($multiSiteFile)) {
194 include $multiSiteFile;
199 if (isset($sites[$uri]) && is_dir($this->appRoot . "/sites/" . $sites[$uri])) {
206 public function getCacheDirectory()
208 if ($this->cacheDirectory) {
209 return $this->cacheDirectory;
212 $configFactory = \Drupal::configFactory();
213 $siteId = $configFactory->get('system.site')
215 $pathTemporary = $configFactory->get('system.file')
216 ->get('path.temporary');
217 $configuration = $this->configurationManager->getConfiguration();
218 $cacheDirectory = $configuration->get('application.cache.directory')?:'';
219 if ($cacheDirectory) {
220 if (strpos($cacheDirectory, '/') != 0) {
221 $cacheDirectory = $this->configurationManager
222 ->getApplicationDirectory() . '/' . $cacheDirectory;
224 $cacheDirectories[] = $cacheDirectory . '/' . $siteId . '/';
226 $cacheDirectories[] = sprintf(
228 $this->configurationManager->getConsoleDirectory(),
231 $cacheDirectories[] = $pathTemporary . '/console/cache/' . $siteId . '/';
233 foreach ($cacheDirectories as $cacheDirectory) {
234 if ($this->isValidDirectory($cacheDirectory)) {
235 $this->cacheDirectory = $cacheDirectory;
240 return $this->cacheDirectory;
243 private function isValidDirectory($path)
245 $fileSystem = new Filesystem();
246 if ($fileSystem->exists($path)) {
250 $fileSystem->mkdir($path);
253 } catch (\Exception $e) {
258 public function cachedServicesFile()
260 return $this->getCacheDirectory().'/console.services.yml';
263 public function cachedServicesFileExists()
265 return file_exists($this->cachedServicesFile());
268 public function removeCachedServicesFile()
270 if ($this->cachedServicesFileExists()) {
271 unlink($this->cachedServicesFile());