File: /home/accemeff/vendor/craftcms/cms/src/console/controllers/ProjectConfigController.php
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/
namespace craft\console\controllers;
use Craft;
use craft\db\Table;
use craft\helpers\Console;
use craft\services\Plugins;
use yii\console\Controller;
use yii\console\ExitCode;
/**
* Manages the project config.
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 3.1
*/
class ProjectConfigController extends Controller
{
/**
* Syncs the project config.
*
* @return int
*/
public function actionSync(): int
{
if (!Craft::$app->getConfig()->getGeneral()->useProjectConfigFile) {
$this->stdout('Craft is not configured to use project.yaml. Please enable the \'useProjectConfigFile\' config setting in config/general.php.' . PHP_EOL, Console::FG_YELLOW);
return ExitCode::OK;
}
// Any plugins need to be installed/uninstalled?
$projectConfig = Craft::$app->getProjectConfig();
$loadedConfigPlugins = array_keys($projectConfig->get(Plugins::CONFIG_PLUGINS_KEY) ?? []);
$yamlPlugins = array_keys($projectConfig->get(Plugins::CONFIG_PLUGINS_KEY, true) ?? []);
$this->_uninstallPlugins(array_diff($loadedConfigPlugins, $yamlPlugins));
if (!$this->_installPlugins(array_diff($yamlPlugins, $loadedConfigPlugins))) {
$this->stdout('Aborting config sync' . PHP_EOL, Console::FG_RED);
return ExitCode::UNSPECIFIED_ERROR;
}
$this->stdout('Applying changes from project.yaml ... ', Console::FG_YELLOW);
try {
$projectConfig->applyYamlChanges();
} catch (\Throwable $e) {
$this->stderr('error: ' . $e->getMessage() . PHP_EOL, Console::FG_RED);
return ExitCode::UNSPECIFIED_ERROR;
}
$this->stdout('done' . PHP_EOL, Console::FG_GREEN);
return ExitCode::OK;
}
/**
* Uninstalls plugins.
*
* @param string[] $handles
*/
private function _uninstallPlugins(array $handles)
{
$pluginsService = Craft::$app->getPlugins();
foreach ($handles as $handle) {
$this->stdout('Uninstalling plugin ', Console::FG_YELLOW);
$this->stdout("\"{$handle}\"", Console::FG_CYAN);
$this->stdout(' ... ', Console::FG_YELLOW);
ob_start();
try {
$pluginsService->uninstallPlugin($handle);
ob_end_clean();
$this->stdout('done' . PHP_EOL, Console::FG_GREEN);
} catch (\Throwable $e) {
ob_end_clean();
$this->stdout('error: ' . $e->getMessage() . PHP_EOL, Console::FG_RED);
Craft::$app->getErrorHandler()->logException($e);
// Just remove the row
Craft::$app->getDb()->createCommand()
->delete(Table::PLUGINS, ['handle' => $handle])
->execute();
}
}
}
/**
* Installs plugins.
*
* @param string[] $handles
* @return bool
*/
private function _installPlugins(array $handles): bool
{
$pluginsService = Craft::$app->getPlugins();
foreach ($handles as $handle) {
$this->stdout('Installing plugin ', Console::FG_YELLOW);
$this->stdout("\"{$handle}\"", Console::FG_CYAN);
$this->stdout(' ... ', Console::FG_YELLOW);
ob_start();
try {
$pluginsService->installPlugin($handle);
ob_end_clean();
$this->stdout('done' . PHP_EOL, Console::FG_GREEN);
} catch (\Throwable $e) {
ob_end_clean();
$this->stdout('error: ' . $e->getMessage() . PHP_EOL, Console::FG_RED);
Craft::$app->getErrorHandler()->logException($e);
return false;
}
}
return true;
}
}