В начале этапа инициализации Joomla инициализирует контейнер внедрения зависимостей (DIC), вызывая createContainer() который находится в library/src/Factory.php. Это приводит к вызову функции register() в каждом из файлов класса в libraries/src/Service/Provider. Просматривая эти файлы, вы можете увидеть, что помещается в DIC при инициализации.

Давайте посмотрим на library/src/Service/Provider/Config.php, который устанавливает класс конфигурации JConfig. Вот что выполняется, когда register() вызывается функция:

$container->alias('config', 'JConfig')
    ->share(
        'JConfig',
        function (Container $container) {
            if (!is_file(JPATH_CONFIGURATION . '/configuration.php')) {
                return new Registry();
            }

            \JLoader::register('JConfig', JPATH_CONFIGURATION . '/configuration.php');

            if (!class_exists('JConfig')) {
                throw new \RuntimeException('Configuration class does not exist.');
            }

            return new Registry(new \JConfig());
        },
        true
    );

Вот объяснение кода:

$container->alias('config', 'JConfig')

Это настраивает псевдоним в DIC, чтобы вы могли вызывать $container->get('config') а также $container->get('JConfig'). Обратите внимание, что возвращаемое значение этой функции снова равно $container чтобы вы могли связывать вызовы функций по цепочке.

Далее следует вызов по адресу share() и передача 3 параметров:

  1. строка 'JConfig'
  2. функция, которая возвращает что-то, что мы рассмотрим в ближайшее время
  3. true – для protected параметр, который означает, что если будет выполнен другой вызов, чтобы попытаться поместить запись с ключом 'JConfig' в DIC, то она будет отклонена (вместо перезаписи этой записи).

Помни об этом share() это то же самое, что set() с использованием параметраshared установленного на true, так что один и тот же экземпляр класса будет возвращен для каждого вызова get('JConfig').

Когда какая-то часть кода Joomla вызывает

$container->get('JConfig')

будет выполнена функция, переданная в качестве параметра 2 выше.

Глобальная конфигурация Joomla хранится в классе JConfig созданном в configuration.php в папке верхнего уровня вашего экземпляра Joomla, чтобы эта функция выполняла следующее:

  1. Проверяет, существует ли configuration.php, и если это не так, просто возвращает пустой набор конфигурационных данных
  2. Регистрирует класс 'JConfig' в configuration.php, чтобы автозагрузчик знал, где его найти
  3. Проверяет, существует ли класс – это заставит PHP вызвать функцию автозагрузчика Joomla, которая затем выполнит require из configuration.php. Если JConfig класс по-прежнему не существует, тогда будет вызвано исключение.
  4. Тот самый JConfig создается экземпляр класса и передается в объект реестра, который затем возвращается.

Поскольку эта запись DIC является общей, экземпляр реестра будет сохранен в DIC и будет возвращен при последующих вызовах get('JConfig').

Таким образом, вы можете получить глобальные параметры конфигурации с помощью

use Joomla\CMS\Factory;
$container = Factory::getContainer();
$container->get('JConfig');   // or ...
$container->get('config');

Эти вызовы передаются непосредственно в DIC для получения общего экземпляра JConfig.

Или вы можете получить их через экземпляр приложения, который уже получил их из DIC:

use Joomla\CMS\Factory;
$application = Factory::getApplication();
$application->getConfig();   
// или, чтобы получить определенный параметр:
$application->get($paramName, $defaultValue);