1

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

return [
    'my_key' => 'my value',
];

我已将它作为定义添加到 php-di 容器中

$builder->addDefinitions(dirname(__DIR__) . '/config.php');
$container = $builder->build();

问题是如何在 di 容器内使用的类的某些方法中从配置文件访问数据?

可以说我有一些课程

class App
{
    private $router;

    public function __construct(Router $router, Request $request)
    {
        $this->router = $router;
        $this->router->doSmth();
    }
}

class Router
{
    public function doSmth()
    {
       // how to access here to the config.php data to receive 'my value'
    }
}

所以当我打电话时

$container->get('\Core\App');

一切都开始了,但我不知道如何访问注册类的方法中的定义数据,因为我在容器本身内没有容器实例来调用 smth

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

3 回答 3

1

在您的App课程__constructor中,参数被注入。就像那些一样,您可以在那里注入配置。

您通过类​​型提示类来引用容器ContainerInterface。正如github 上的问题中所述,您的代码App将如下所示:

class App
{
    private $router;

    public function __construct(Router $router, Request $request, ContainerInterface $c)
    {
        $this->router = $router;
        $this->router->doSmth($c->get('my_key'));
    }
}

class Router
{
    public function doSmth($my_key)
    {
       // You now have access to that particular key from the settings
    }
}

这将使您Router依赖于通过doSmth()函数获取配置。


根据您对类的使用,您可能希望放松对使用该配置参数Router进行调用的依赖。doSmth($my_key)由于在App类中你正在注入类,这意味着你也可以从类本身Router的注入中获利。Router就像你__constructApp课堂一样,你也可以在Router课堂上做到这一点。

现在从我的头顶上做这个,但如果我没记错的话,这应该可以工作......

您的代码将如下所示:

class App
{
    private $router;

    public function __construct(Router $router, Request $request)
    {
        $this->router = $router;
        $this->router->doSmth();
    }
}

class Router
{
    private $some_setting;

    public function __construct(ContainerInterface $c)
    {
       $this->some_setting = $c->get('my_key');
    }

    public function doSmth()
    {
       // You now have access to $this->some_setting
    }
}

请注意,my_key如果例如将settings.php带有数组的文件添加为定义,则密钥直接来自 PHP-DI 容器定义。更多关于这里的定义。当我自己将它与 Slim 框架结合起来时,我通常会在我的密钥前面settings.php加上settings.例如setting.my_key. 但是,如果利用扩展定义的能力,可能有更清洁的解决方案可用。

于 2019-06-04T10:06:05.803 回答
0

您需要配置要在对象中注入的内容:http: //php-di.org/doc/php-definitions.html#autowired-objects

于 2019-06-04T07:56:25.407 回答
0

如果您只想要价值,我认为您可以使用DI\get.

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

从这里: http: //php-di.org/doc/environments.html

于 2019-06-03T21:28:20.553 回答