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
43 $this->appRoot = $appRoot;
44 $this->configurationManager = $configurationManager;
47 public function loadLegacyFile($legacyFile, $relative = true)
50 $legacyFile = realpath(
51 sprintf('%s/%s', $this->appRoot, $legacyFile)
55 if (file_exists($legacyFile)) {
56 include_once $legacyFile;
67 public function getStandardLanguages()
69 $standardLanguages = LanguageManager::getStandardLanguageList();
71 foreach ($standardLanguages as $langcode => $standardLanguage) {
72 $languages[$langcode] = $standardLanguage[0];
81 public function getDatabaseTypes()
83 $this->loadLegacyFile('/core/includes/install.inc');
84 $this->setMinimalContainerPreKernel();
86 $driverDirectories = [
87 $this->appRoot . '/core/lib/Drupal/Core/Database/Driver',
88 $this->appRoot . '/drivers/lib/Drupal/Driver/Database'
91 $driverDirectories = array_filter(
93 function ($directory) {
94 return is_dir($directory);
98 $finder = new Finder();
99 $finder->directories()
100 ->in($driverDirectories)
104 foreach ($finder as $driver_folder) {
105 if (file_exists($driver_folder->getRealpath() . '/Install/Tasks.php')) {
106 $driver = $driver_folder->getBasename();
107 $installer = db_installer_object($driver);
108 // Verify is database is installable
109 if ($installer->installable()) {
110 $reflection = new \ReflectionClass($installer);
111 $install_namespace = $reflection->getNamespaceName();
112 // Cut the trailing \Install from namespace.
113 $driver_class = substr($install_namespace, 0, strrpos($install_namespace, '\\'));
114 $databases[$driver] = ['namespace' => $driver_class, 'name' =>$installer->name()];
122 protected function setMinimalContainerPreKernel()
124 // Create a minimal mocked container to support calls to t() in the pre-kernel
125 // base system verification code paths below. The strings are not actually
126 // used or output for these calls.
127 $container = new ContainerBuilder();
128 $container->setParameter('language.default_values', Language::$defaultValues);
130 ->register('language.default', 'Drupal\Core\Language\LanguageDefault')
131 ->addArgument('%language.default_values%');
133 ->register('string_translation', 'Drupal\Core\StringTranslation\TranslationManager')
134 ->addArgument(new Reference('language.default'));
136 // Register the stream wrapper manager.
138 ->register('stream_wrapper_manager', 'Drupal\Core\StreamWrapper\StreamWrapperManager')
139 ->addMethodCall('setContainer', [new Reference('service_container')]);
141 ->register('file_system', 'Drupal\Core\File\FileSystem')
142 ->addArgument(new Reference('stream_wrapper_manager'))
143 ->addArgument(Settings::getInstance())
144 ->addArgument((new LoggerChannelFactory())->get('file'));
146 \Drupal::setContainer($container);
149 public function getDatabaseTypeDriver($driver)
151 // We cannot use Database::getConnection->getDriverClass() here, because
152 // the connection object is not yet functional.
153 $task_class = "Drupal\\Core\\Database\\Driver\\{$driver}\\Install\\Tasks";
154 if (class_exists($task_class)) {
155 return new $task_class();
157 $task_class = "Drupal\\Driver\\Database\\{$driver}\\Install\\Tasks";
158 return new $task_class();
165 public function getAutoload()
167 $autoLoadFile = $this->appRoot.'/autoload.php';
169 return include $autoLoadFile;
175 public function multisiteMode($uri)
177 if ($uri != 'default') {
187 public function validMultisite($uri)
189 $multiSiteFile = sprintf(
190 '%s/sites/sites.php',
194 if (file_exists($multiSiteFile)) {
195 include $multiSiteFile;
200 if (isset($sites[$uri]) && is_dir($this->appRoot . "/sites/" . $sites[$uri])) {
207 public function getCacheDirectory()
209 if ($this->cacheDirectory) {
210 return $this->cacheDirectory;
213 $configFactory = \Drupal::configFactory();
214 $siteId = $configFactory->get('system.site')
216 $pathTemporary = $configFactory->get('system.file')
217 ->get('path.temporary');
218 $configuration = $this->configurationManager->getConfiguration();
219 $cacheDirectory = $configuration->get('application.cache.directory')?:'';
220 if ($cacheDirectory) {
221 if (strpos($cacheDirectory, '/') != 0) {
222 $cacheDirectory = $this->configurationManager
223 ->getApplicationDirectory() . '/' . $cacheDirectory;
225 $cacheDirectories[] = $cacheDirectory . '/' . $siteId . '/';
227 $cacheDirectories[] = sprintf(
229 $this->configurationManager->getConsoleDirectory(),
232 $cacheDirectories[] = $pathTemporary . '/console/cache/' . $siteId . '/';
234 foreach ($cacheDirectories as $cacheDirectory) {
235 if ($this->isValidDirectory($cacheDirectory)) {
236 $this->cacheDirectory = $cacheDirectory;
241 return $this->cacheDirectory;
244 private function isValidDirectory($path)
246 $fileSystem = new Filesystem();
247 if ($fileSystem->exists($path)) {
251 $fileSystem->mkdir($path);
254 } catch (\Exception $e) {