基于构建时间变量的复杂 PHP-DI 配置

问题描述 投票:0回答:1

对于我的 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 文件中搜索它们时,我必须知道这些目录。

php dependency-injection php-di
1个回答
0
投票

我不知道这是否有帮助,但是,您可以使用工厂来实现这一点。工厂可以将容器作为参数,然后使用它来获取“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”时执行一次。

© www.soinside.com 2019 - 2024. All rights reserved.