php-di如何访问容器定义

时间:2019-06-03 16:49:30

标签: php dependency-injection php-di

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

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'

3 个答案:

答案 0 :(得分:1)

在您的App__constructor中,将注入参数。就像这些一样,您可以在其中注入配置。

您可以通过提示ContainerInterface类的类型来引用容器。如issue on 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类的用法,您可能想放宽对使用该config参数调用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容器定义。有关定义here的更多信息。当我将自己与Slim框架结合在一起时,我通常将settings.php中的密钥放在settings.之前,例如setting.my_key。但是,如果利用extends definitions的功能,可能会有更清洁的解决方案。

答案 1 :(得分:0)

如果您只想要该值,那么我认为您可以使用DI\get

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

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

答案 2 :(得分:0)

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