【问题标题】:Referencing PHP-DI definitions defined as multi-dimensional arrays引用定义为多维数组的 PHP-DI 定义
【发布时间】:2023-03-24 00:33:01
【问题描述】:

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

感谢您的支持。

【问题讨论】:

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


    【解决方案1】:

    这是不可能的。但是你可以做这样的事情(但它不是很可读):

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

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

    【讨论】:

    • 谢谢你,马修。我认为它不会像我介绍的那样工作,但我希望我错过了这样做的功能,在 PHP-DI 的文档/代码中的某个地方......确实,不是很可读,但是一个很好的建议。我现在知道它是可能的,我会平衡它的使用......另外,我要祝贺你完成了伟大的 PHP-DI 项目!祝你好运!
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多