input = $input; $this->output = $output; $this->writer = $writer; $this->reader = $reader; $this->filesystem = $filesystem; $this->configProvider = $configProvider ?: ObjectManager::getInstance()->get(ConfigProvider::class); $this->processorFacadeFactory = $processorFacadeFactory ?: ObjectManager::getInstance()->get(ProcessorFacadeFactory::class); $this->emulatedAreaProcessor = $emulatedAreaProcessor ?: ObjectManager::getInstance()->get(EmulatedAdminhtmlAreaProcessor::class); $this->maintenanceModeEnabler = $maintenanceModeEnabler ?: ObjectManager::getInstance()->get(MaintenanceModeEnabler::class); } /** * Enable production mode * * @throws LocalizedException * @return void */ public function enableProductionMode() { $this->maintenanceModeEnabler->executeInMaintenanceMode( function () { $previousMode = $this->getMode(); try { // We have to turn on production mode before generation. // We need this to enable generation of the "min" files. $this->setStoreMode(State::MODE_PRODUCTION); $this->filesystem->regenerateStatic($this->output); } catch (LocalizedException $e) { // We have to return store mode to previous state in case of error. $this->setStoreMode($previousMode); throw $e; } }, $this->output, false ); } /** * Only lock static resource locations and set store mode, without handling static content * * @return void */ public function enableProductionModeMinimal() { $this->setStoreMode(State::MODE_PRODUCTION); } /** * Enable Developer mode * * @return void */ public function enableDeveloperMode() { $this->filesystem->cleanupFilesystem( [ DirectoryList::CACHE, DirectoryList::GENERATED_CODE, DirectoryList::GENERATED_METADATA, DirectoryList::TMP_MATERIALIZATION_DIR, DirectoryList::STATIC_VIEW, ] ); $this->setStoreMode(State::MODE_DEVELOPER); } /** * Enable Default mode. * * @return void */ public function enableDefaultMode() { $this->filesystem->cleanupFilesystem( [ DirectoryList::CACHE, DirectoryList::GENERATED_CODE, DirectoryList::GENERATED_METADATA, DirectoryList::TMP_MATERIALIZATION_DIR, DirectoryList::STATIC_VIEW, ] ); $this->setStoreMode(State::MODE_DEFAULT); } /** * Get current mode information * * @return string * @throws \Exception */ public function getMode() { $env = $this->reader->load(); return isset($env[State::PARAM_MODE]) ? $env[State::PARAM_MODE] : null; } /** * Store mode in env.php * * @param string $mode * @return void */ protected function setStoreMode($mode) { $this->saveAppConfigs($mode); $data = [ ConfigFilePool::APP_ENV => [ State::PARAM_MODE => $mode ] ]; $this->writer->saveConfig($data); } /** * Save application configs while switching mode * * @param string $mode * @return void */ private function saveAppConfigs($mode) { $configs = $this->configProvider->getConfigs($this->getMode(), $mode); foreach ($configs as $path => $value) { $this->emulatedAreaProcessor->process(function () use ($path, $value) { $this->processorFacadeFactory->create()->processWithLockTarget( $path, $value, ScopeConfigInterface::SCOPE_TYPE_DEFAULT, null, true ); }); $this->output->writeln('Config "' . $path . ' = ' . $value . '" has been saved.'); } } }