跳至主要内容
版本:5.1

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 个参数

  1. 字符串 'JConfig'
  2. 一个返回某些内容的函数,我们稍后会详细介绍
  3. true – 对于 protected 参数,这意味着如果另一个调用尝试将具有键 'JConfig' 的条目放入 DIC 中,则该条目将被拒绝(而不是覆盖此条目)。

请记住,share()set() 相同,但 shared 参数设置为 true,因此对于每个 get('JConfig') 调用,都将返回相同的类实例。

当 Joomla 代码的某些部分调用

$container->get('JConfig')

时,将执行上面作为参数 2 传递的函数。

Joomla 全局配置保存在 Joomla 实例顶层文件夹中的 configuration.php 文件中的 JConfig 类中,因此该函数执行以下操作

  1. 检查 configuration.php 是否存在,如果不存在,则仅返回一组空的配置数据
  2. 在 configuration.php 中注册 'JConfig' 类,以便自动加载器知道在哪里找到它
  3. 检查类是否存在 - 这将强制 PHP 调用 Joomla 自动加载器函数,然后该函数将对 configuration.php 执行 require 操作。如果 JConfig 类仍然不存在,则会引发异常。
  4. 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);