php - 在 PHP-DI 中创建对象时,如何执行一段代码?
问题描述
我这样设置我的依赖项\DI\Container
:
$this->container = new \DI\Container();
$this->container->set('AdyenClient', \DI\create('\Adyen\Client'));
$this->container->set('AdyenCheckout', \DI\create('\Adyen\Service\Checkout')->constructor($this->container->get('AdyenClient')));
\Adyen\Client
无法在构造中配置,因此我需要在第一次创建后执行一个与configClient()
创建的对象没有任何关联的函数。
是否可以在第一次创建对象时“触发”该方法或任何其他代码$this->container->get('AdyenClient')
,即使需要更改依赖项的设置方式?
据我阅读,官方文档中没有任何类似的场景。
解决方案
使用 DI\create()
您可以使用CreateDefinitionHelper::method在创建对象时定义方法调用。像这样:
$this->container = new \DI\Container();
$this->container->set('AdyenClient',
\DI\create('\Adyen\Client')->method('configClient', $param1, $param2));
$this->container->set('AdyenCheckout',
\DI\create('\Adyen\Service\Checkout')->constructor($this->container->get('AdyenClient')));
PHP-DI 将在首次创建后使用 $param1 和 $param2 调用 AdyenClient::configClient。
使用 DI\factory()
或者,您可以使用该DI\factory
函数(从回调创建FactoryDefinitionHelper ):
$this->container = new \DI\Container();
$this->container->set('AdyenClient',
\DI\factory(function (Psr\Container\ContainerInterface $container) {
$adyenClient = $container->get('\Adyen\Client');
configClient($adyenClient);
return $adyenClient;
});
$this->container->set('AdyenCheckout',
\DI\create('\Adyen\Service\Checkout')->constructor($this->container->get('AdyenClient')));
这应该是一种更灵活的方式来定义容器中的任何延迟加载的东西。
推荐阅读
- reactjs - 如何在 React 中创建编辑按钮?
- codeigniter - 如何在codeigniter中从数据库中检索检查值
- python - TensorFlow 2.0:你需要在每个函数之上添加一个 @tf.function 装饰器吗?
- java - 是否可以通过创建 1 个对象而不是多个对象来访问 Java 构造函数
- scala - 无法加载套件类。这可能是由于您的运行路径中的错误。缺少类 com.serviceyou.com.tests.ServiceYouTest
- android - 获取当前位置为 0.0, 0.0
- python - 如何在python中遍历复杂的json
- c - if 语句中的条件
- c# - 如何在 C# 中将字符串转换为 int
- c# - 如何使用 ExpressMapper 映射递归嵌套对象