0

如果我有如下定义的数组,则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方法。一般来说,它是关于引用数组中定义的配置选项。

谢谢您的支持。

4

1 回答 1

0

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

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

在未来的 v6.0 中,您还可以移除DI\factory并直接放置闭包。

于 2018-01-11T14:41:44.003 回答