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/php-definitions.html#autowired-objects
在你的App
class__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.
我有一些配置文件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/php-definitions.html#autowired-objects
在你的App
class__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.