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);