在 PHP-DI 中创建对象时如何执行一段代码?
How is possible to execute a piece of code when an object is created in 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')
第一次创建对象时是否可以 'trigger' 该方法或任何其他代码,即使需要更改依赖项的设置方式起来了吗?
据我所知,官方文档中没有任何类似的场景。
与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')));
这应该是一种更灵活的方式来定义容器中的任何延迟加载的东西。
我用 \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')
第一次创建对象时是否可以 'trigger' 该方法或任何其他代码,即使需要更改依赖项的设置方式起来了吗?
据我所知,官方文档中没有任何类似的场景。
与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')));
这应该是一种更灵活的方式来定义容器中的任何延迟加载的东西。