vendor/shopware/core/System/SystemConfig/SystemConfigLoader.php line 50

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\System\SystemConfig;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\DataAbstractionLayer\Field\ConfigJsonField;
  5. use Shopware\Core\Framework\Log\Package;
  6. use Shopware\Core\Framework\Plugin;
  7. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  8. use Shopware\Core\Framework\Uuid\Uuid;
  9. use Shopware\Core\Kernel;
  10. use function array_shift;
  11. use function explode;
  12. use function json_decode;
  13. #[Package('system-settings')]
  14. class SystemConfigLoader extends AbstractSystemConfigLoader
  15. {
  16.     /**
  17.      * @internal
  18.      */
  19.     public function __construct(
  20.         protected Connection $connection,
  21.         protected Kernel $kernel
  22.     ) {
  23.     }
  24.     public function getDecorated(): AbstractSystemConfigLoader
  25.     {
  26.         throw new DecorationPatternException(self::class);
  27.     }
  28.     public function load(?string $salesChannelId): array
  29.     {
  30.         $query $this->connection->createQueryBuilder();
  31.         $query->from('system_config');
  32.         $query->select(['configuration_key''configuration_value']);
  33.         if ($salesChannelId === null) {
  34.             $query
  35.                 ->andWhere('sales_channel_id IS NULL');
  36.         } else {
  37.             $query->andWhere('sales_channel_id = :salesChannelId OR system_config.sales_channel_id IS NULL');
  38.             $query->setParameter('salesChannelId'Uuid::fromHexToBytes($salesChannelId));
  39.         }
  40.         $query->addOrderBy('sales_channel_id''ASC');
  41.         $result $query->executeQuery();
  42.         return $this->buildSystemConfigArray($result->fetchAllKeyValue());
  43.     }
  44.     private function buildSystemConfigArray(array $systemConfigs): array
  45.     {
  46.         $configValues = [];
  47.         foreach ($systemConfigs as $key => $value) {
  48.             $keys explode('.', (string) $key);
  49.             if ($value !== null) {
  50.                 $value json_decode((string) $valuetrue512\JSON_THROW_ON_ERROR);
  51.                 if ($value === false || !isset($value[ConfigJsonField::STORAGE_KEY])) {
  52.                     $value null;
  53.                 } else {
  54.                     $value $value[ConfigJsonField::STORAGE_KEY];
  55.                 }
  56.             }
  57.             $configValues $this->getSubArray($configValues$keys$value);
  58.         }
  59.         return $this->filterNotActivatedPlugins($configValues);
  60.     }
  61.     /**
  62.      * @param array|bool|float|int|string|null $value
  63.      */
  64.     private function getSubArray(array $configValues, array $keys$value): array
  65.     {
  66.         $key array_shift($keys);
  67.         if (empty($keys)) {
  68.             // Configs can be overwritten with sales_channel_id
  69.             $inheritedValuePresent \array_key_exists($key$configValues);
  70.             $valueConsideredEmpty = !\is_bool($value) && empty($value);
  71.             if ($inheritedValuePresent && $valueConsideredEmpty) {
  72.                 return $configValues;
  73.             }
  74.             $configValues[$key] = $value;
  75.         } else {
  76.             if (!\array_key_exists($key$configValues)) {
  77.                 $configValues[$key] = [];
  78.             }
  79.             $configValues[$key] = $this->getSubArray($configValues[$key], $keys$value);
  80.         }
  81.         return $configValues;
  82.     }
  83.     private function filterNotActivatedPlugins(array $configValues): array
  84.     {
  85.         $notActivatedPlugins $this->kernel->getPluginLoader()->getPluginInstances()->filter(fn (Plugin $plugin) => !$plugin->isActive())->all();
  86.         foreach ($notActivatedPlugins as $plugin) {
  87.             if (isset($configValues[$plugin->getName()])) {
  88.                 unset($configValues[$plugin->getName()]);
  89.             }
  90.         }
  91.         return $configValues;
  92.     }
  93. }