引用 PHP-定义为多维数组的 DI 定义
Referencing PHP-DI definitions defined as multi-dimensional arrays
如果我有如下定义的数组,在其他对象中注入一个 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>),
];
请注意,这并不是将相应的完全限定 class 名称(如 \FastRoute\RouteParser\Std
)作为参数传递给 constructorParameter
方法。通常,它是关于引用数组中定义的配置选项。
感谢您的支持。
开箱即用是不可能的。但是你可以做这样的事情(但它不是很可读):
RouteCollector::class => DI\object()
->constructorParameter('routeParser', DI\factory(function ($c) {
return $c->get('router.options')['routeParser'];
}))
在未来的 v6.0 中,您还可以删除 DI\factory
并直接放置闭包。
如果我有如下定义的数组,在其他对象中注入一个 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>),
];
请注意,这并不是将相应的完全限定 class 名称(如 \FastRoute\RouteParser\Std
)作为参数传递给 constructorParameter
方法。通常,它是关于引用数组中定义的配置选项。
感谢您的支持。
开箱即用是不可能的。但是你可以做这样的事情(但它不是很可读):
RouteCollector::class => DI\object()
->constructorParameter('routeParser', DI\factory(function ($c) {
return $c->get('router.options')['routeParser'];
}))
在未来的 v6.0 中,您还可以删除 DI\factory
并直接放置闭包。