对于我的 PHP-DI 定义,我需要预先进行复杂的计算,这些计算基于并非来自 PHP-DI 的其他配置(这些配置在构建时存储在变量中)。因为解释比展示更难,让我举一个简化的例子来展示我想做的事情,但实际上行不通。
首先让我们构建容器。这里的代码没什么特别的,应该可以工作:
<?php
use DI\Container;
use DI\ContainerBuilder;
class MyContainerBuilder
{
// @param number is the build time (configuration) variable
// I would like to use later
public function build(int $number): Container
{
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(['number' => $number]);
// In config.php I now want to do some complex calculations
$builder->addDefinitions(__DIR__ . '/config.php');
// here the container may be compiled, such that in production, the complex
// calculations from `config.php` will only be done once (to my understanding)
return $builder->build();
}
}
现在有问题的部分来了。
config.php
中的计算
<?php
$number = $container->get('number');
// complex calculation:
$number += 1;
return [
'improvedNumber' => $number,
];
这当然是不可能的,因为 php-di 容器在配置文件中似乎不可用。是否仍然可以以某种方式在
$number
中提供 config.php
的值?
旁注:我真正尝试归档的是确定一堆服务,这些服务应使用 php-di 注入。这些服务位于几个目录中,当在 config.php 文件中搜索它们时,我必须知道这些目录。
我不知道这是否有帮助,但是,您可以使用工厂来实现这一点。工厂可以将容器作为参数,然后使用它来获取“number”值。这是一个例子:
<?php
use DI\Container;
use DI\ContainerBuilder;
class MyContainerBuilder
{
public function build(int $number): Container
{
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(['number' => $number]);
$builder->addDefinitions([
'improvedNumber' => function (Container $c) {
$number = $c->get('number');
// complex calculation:
$number += 1;
return $number;
},
]);
return $builder->build();
}
}
在此示例中,“improvedNumber”服务被定义为工厂。当你向容器询问‘improvedNumber’时,它会执行工厂函数,从容器中获取‘number’,进行复杂的计算,然后返回结果。
这样,即使容器在配置文件中不可用,您也可以在配置中使用“number”的值。工厂函数仅在您向容器请求“improvedNumber”时执行,因此复杂的计算仅在首次请求“improvedNumber”时执行一次。