我用这样的DIContainer
设置了我的依赖项:
$this->container = new DIContainer();
$this->container->set('AdyenClient', DIcreate('AdyenClient'));
$this->container->set('AdyenCheckout', DIcreate('AdyenServiceCheckout')->constructor($this->container->get('AdyenClient')));
AdyenClient
无法在构造中配置,因此我需要在首次创建对象后执行一个与创建的对象不以任何方式关联的configClient()
函数。
是否可以在$this->container->get('AdyenClient')
第一次创建对象时"触发"该方法或任何其他代码段,即使需要更改依赖项的设置方式?
据我所知,官方文档中没有任何类似的情况。
with DI\create((
您可以使用 CreateDefinitionHelper::method 在创建对象时定义方法调用。喜欢这个:
$this->container = new DIContainer();
$this->container->set('AdyenClient',
DIcreate('AdyenClient')->method('configClient', $param1, $param2));
$this->container->set('AdyenCheckout',
DIcreate('AdyenServiceCheckout')->constructor($this->container->get('AdyenClient')));
PHP-DI 在首次创建后将使用 $param 1 和 $param 2 调用 AdyenClient::configClient。
使用 DI\factory((
或者,您可以使用DIfactory
函数(它从回调创建 FactoryDefinitionHelper(:
$this->container = new DIContainer();
$this->container->set('AdyenClient',
DIfactory(function (PsrContainerContainerInterface $container) {
$adyenClient = $container->get('AdyenClient');
configClient($adyenClient);
return $adyenClient;
});
$this->container->set('AdyenCheckout',
DIcreate('AdyenServiceCheckout')->constructor($this->container->get('AdyenClient')));
这应该是定义容器中任何延迟加载事物的更灵活方法。