03 - Пример JConfig
В начале этапа инициализации 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 параметров:
- строка 'JConfig'
- функция, которая возвращает что-то, что мы рассмотрим в ближайшее время
true– дляprotectedпараметр, который означает, что если будет выполнен другой вызов, чтобы попытаться поместить запись с ключом 'JConfig' в DIC, то она будет отклонена (вместо перезаписи этой записи).
Помни об этом share() это то же самое, что set() с использованием параметраshared установленного на true, так что один и тот же экземпляр класса будет возвращен для каждого вызова get('JConfig').
Когда какая-то часть кода Joomla вызывает
$container->get('JConfig')
будет выполнена функция, переданная в качестве параметра 2 выше.
Глобальная конфигурация Joomla хранится в классе JConfig созданном в configuration.php в папке верхнего уровня вашего экземпляра Joomla, чтобы эта функция выполняла следующее:
- Проверяет, существует ли configuration.php, и если это не так, просто возвращает пустой набор конфигурационных данных
- Регистрирует класс 'JConfig' в configuration.php, чтобы автозагрузчик знал, где его найти
- Проверяет, существует ли класс – это заставит PHP вызвать функцию автозагрузчика Joomla, которая затем выполнит
requireиз configuration.php. ЕслиJConfigкласс по-прежнему не существует, тогда будет вызвано исключение. - Тот самый
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);