首页 > 解决方案 > 在 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'),即使需要更改依赖项的设置方式?

据我阅读,官方文档中没有任何类似的场景。

标签: phpdependency-injectionconstructorcallbackphp-di

解决方案


使用 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函数(从回调创建FactoryDe​​finitionHelper ):

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

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


推荐阅读