我有一些配置文件,该配置文件返回键值数组
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'
答案 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
类本身中的注入中受益。就像您__construct
类App
一样,您也可以使用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');
}
答案 2 :(得分:0)
您需要配置要在对象中注入的内容:http://php-di.org/doc/php-definitions.html#autowired-objects