php di如何访问容器定义

php di如何访问容器定义,php,dependency-injection,php-di,Php,Dependency Injection,Php Di,我有一些返回键值数组的配置文件 返回[ “我的密钥”=>“我的值”, ]; 我已将其作为定义添加到PHPDI容器中 $builder->addDefinitions(dirname(_DIR__)。'/config.php'); $container=$builder->build(); 问题是如何从di容器中使用的类的某个方法中的配置文件访问数据 假设我有一些课程 class应用程序 { 私人路由器; 公共函数构造(路由器$Router,请求$Request) { $this->route

我有一些返回键值数组的配置文件

返回[
“我的密钥”=>“我的值”,
];
我已将其作为定义添加到PHPDI容器中

$builder->addDefinitions(dirname(_DIR__)。'/config.php');
$container=$builder->build();
问题是如何从di容器中使用的类的某个方法中的配置文件访问数据

假设我有一些课程

class应用程序
{
私人路由器;
公共函数构造(路由器$Router,请求$Request)
{
$this->router=$router;
$this->router->doSmth();
}
}
类路由器
{
公共函数doSmth()
{
//如何在此处访问config.php数据以接收“我的值”
}
}
所以当我打电话的时候

$container->get('\Core\App');
一切都开始了,但我不知道如何访问已注册类的方法中的定义数据,因为容器本身中没有容器实例来调用smth

$container->get('my_key'); // return 'my value'

如果您只是想要这个值,我想您可以使用
DI\get

public function doSmth() {
    echo DI\get('my_key');
}

从这里开始:

您需要配置向对象中注入的内容:

应用程序中
\u构造函数中
注入参数。就像这些一样,您可以在那里注入配置

您可以通过暗示
ContainerInterface
类的类型引用容器。如《应用程序代码》中所述,你的应用程序代码如下:

class应用程序
{
私人路由器;
公共函数构造(路由器$Router,请求$Request,容器接口$c)
{
$this->router=$router;
$this->router->doSmth($c->get('my_key'));
}
}
类路由器
{
公共功能doSmth($my_key)
{
//现在,您可以从设置中访问该特定密钥
}
}
这将使您的
路由器依赖于通过
doSmth()
函数获取配置


根据您对
Router
类的使用情况,您可能希望释放对使用该配置参数调用
doSmth($my_key)
的依赖性。由于在
App
类中,您正在注入
Router
类,这意味着您也可以从
Router
类本身的注入中获益。就像你如何构建你的
应用程序
类一样,你也可以通过你的
路由器
类来实现

现在从我的头顶开始做这件事,但是如果我没有弄错的话,这应该会起作用

您的代码如下所示:

class应用程序
{
私人路由器;
公共函数构造(路由器$Router,请求$Request)
{
$this->router=$router;
$this->router->doSmth();
}
}
类路由器
{
私人$some_设置;
公共函数构造(容器接口$c)
{
$this->some_setting=$c->get('my_key');
}
公共函数doSmth()
{
//您现在可以访问$this->some\u设置
}
}


请注意,
my_key
键直接来自PHP-DI容器定义,例如,如果将带有数组的
settings.PHP
文件添加为定义。更多关于定义的信息。由于我自己将其与Slim框架相结合,我通常在
settings.php
中使用
settings.
预先设置键,例如
setting.my_key
。但是,如果利用以下功能,可能会有更干净的解决方案可用。

这将不起作用,
DI\get()
应仅在configuration.TY中使用,以便快速回答。昨天我不断地尝试,发现了这种魔力。只需将构造函数签名引用添加到Psr\Container\ContainerInterface就足够了,就像您在这里的答案中所显示的那样,然后神奇地出现:)您在示例中还有一个问题需要解决,请访问“settings.my_key”。是否可以定义“命名”?或者,对于DI容器,以这种方式命名数组键(点分隔)是一种很好的做法?不确定“命名”定义的含义。当作为数组定义添加时,设置以某种方式转换为点键表示法。对我来说,这已经足够好了,所以我不再费心研究其他解决方案;)奇怪,这对我来说不起作用。如果我按文件名尝试,没有为“routes.hello”找到条目或类,只有设置不起作用,也没有为“settings.hello”找到条目或类,只有在我调用“hello”$c->get('hello')时才起作用。只有当我将数组键命名为settings.hello时,我才能以“settings.hello”的形式访问它@Eugene Ah,非常抱歉!完全忘了那部分。我的
settings.php
数组中的我的键确实是
settings.My_key
。接下来,我介绍了PHP-DI是如何记录Slim()的配置的。我也不想用设置键污染容器根键(除非有明确的设置,因此
settings.
prepend)。现在我阅读了更多关于定义的内容,您可能可以为设置定义创建一种更干净的方法(可能使用此方法)我编辑了我的答案,使这部分的关键来自更清楚一点。