在 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')));

这应该是一种更灵活的方式来定义容器中的任何延迟加载的东西。