JConfig 示例
在初始化阶段的早期,Joomla 通过调用位于 library/src/Factory.php 中的 createContainer()
函数来初始化依赖注入容器 (DIC)。这会导致在 libraries/src/Service/Provider 中每个类文件中调用 register()
函数。通过查看这些文件,您可以了解在初始化时哪些内容被放入 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 全局配置保存在 Joomla 实例顶层文件夹中的 configuration.php 文件中的 JConfig
类中,因此该函数执行以下操作
- 检查 configuration.php 是否存在,如果不存在,则仅返回一组空的配置数据
- 在 configuration.php 中注册 'JConfig' 类,以便自动加载器知道在哪里找到它
- 检查类是否存在 - 这将强制 PHP 调用 Joomla 自动加载器函数,然后该函数将对 configuration.php 执行
require
操作。如果JConfig
类仍然不存在,则会引发异常。 JConfig
类被实例化,并传递到一个 Registry 对象中,然后返回该对象。
由于此 DIC 条目是共享的,因此 Registry 实例将存储在 DIC 中,并在后续对 get('JConfig')
的调用中返回。
因此,您可以通过以下方式获取全局配置参数
use Joomla\CMS\Factory;
$container = Factory::getContainer();
$container->get('JConfig'); // or ...
$container->get('config');
这些调用直接转到 DIC 以获取共享的 JConfig 实例。
或者,您可以通过 Application 实例获取它们,该实例已从 DIC 中获取了它们
use Joomla\CMS\Factory;
$application = Factory::getApplication();
$application->getConfig();
// or, to get a particular parameter:
$application->get($paramName, $defaultValue);