引用定义为多维数组的PHP-DI定义

时间:2018-01-11 13:59:45

标签: php dependency-injection ioc-container php-di

如果我有一个如下所示的定义数组,则在其他对象中注入RouteCollector实例将完美执行:

use MyApp\Routing\RouteCollector;

return [
    'router.options.routeParser' => 'FastRoute\\RouteParser\\Std',
    'router.options.dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
    RouteCollector::class => DI\object()
            ->constructorParameter('routeParser', DI\get('router.options.routeParser'))
            ->constructorParameter('dataGenerator', DI\get('router.options.dataGenerator')),
];

但如果我将router.options定义定义为数组,是否有办法实现相同的结果?例如。如何在RouteCollector::class定义中引用其元素?

use MyApp\Routing\RouteCollector;

return [
    'router.options' => [
        'routeParser' => 'FastRoute\\RouteParser\\Std',
        'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
    ],
    RouteCollector::class => DI\object()
            ->constructorParameter('routeParser', <ASKING>)
            ->constructorParameter('dataGenerator', <ASKING>),
];

请注意,它不是将相应的完全限定类名(如\FastRoute\RouteParser\Std)作为参数传递给constructorParameter方法。它通常用于引用数组中定义的配置选项。

感谢您的支持。

1 个答案:

答案 0 :(得分:0)

这不是开箱即用的。但是你可以这样做(但它不是很易读):

RouteCollector::class => DI\object()
        ->constructorParameter('routeParser', DI\factory(function ($c) {
              return $c->get('router.options')['routeParser'];
          }))

对于未来的v6.0,您还可以删除DI\factory并直接关闭。