php-di 如何访问容器定义

php-di how to access container definitions

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

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

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

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

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

假设我有一些 classes

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');

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

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

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

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

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

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

在你的Appclass__constructor中注入参数。就像那些,你可以在那里注入配置。

您通过类型提示 ContainerInterface class 引用容器。如 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 class 的使用情况,您可能希望解除对使用该配置参数调用 doSmth($my_key) 的依赖。由于在 App class 中您正在注入 Router class,这意味着您也可以从 Router class 本身的注入中获利。就像您 __construct 您的 App class 一样,您也可以使用 Router class.

现在从我的头顶开始做这件事,但如果我没记错的话这应该有用...

您的代码将如下所示:

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 键直接来自 PHP-DI 容器定义,例如,如果将带有数组的 settings.php 文件添加为定义。有关定义的更多信息 here. As I am combining this myself with the Slim framework, I usually prepend my keys in settings.php with settings. like for example setting.my_key. However there are probably cleaner solutions available if making use of the ability to extends definitions.