如何在PHP-DI的定义中使用autowire(...),create(...)和get(...)?

时间:2018-03-25 10:50:39

标签: dependency-injection dependencies php-di

PHP-DI 6提供了多种功能,可在definitions中使用。其中三个似乎在定义上下文中也是如此:autowire(...)create(...)get(...)。例如。我有以下类型:

FooServiceInterface
BarServiceInterface
FooAService implements FooServiceInterface
    dependencies: BarServiceInterface $barService
FooBService implements FooServiceInterface
    dependencies: BarServiceInterface $barService
BarService implements BarServiceInterface
    dependencies: -

FooServiceInterface被注入Symfony控制器(构造函数注入)。

现在我的文件带有定义:

return [
    FooServiceInterface::class => DI\autowire(FooBService::class),
    BarServiceInterface::class => DI\autowire(BarService::class),
];

有效。

我也可以这样设置:

return [
    FooServiceInterface::class => DI\get(FooBService::class),
    BarServiceInterface::class => DI\get(BarService::class),
];

它仍然有效。

return [
    FooServiceInterface::class => DI\create(FooBService::class),
    BarServiceInterface::class => DI\create(BarService::class),
];

不起作用。

这个

return [
    FooServiceInterface::class => DI\get(FooBService::class),
    BarServiceInterface::class => DI\create(BarService::class),
];

确实

三个函数之间有什么区别(在定义的上下文中)?建议使用哪一个设置公共接口依赖关系定义(如SomeInterface::class => DI\recommendedFunction(SomeClass::class))?

1 个答案:

答案 0 :(得分:1)

我会说只有在你知道为什么需要它时才使用get()

然后在autowire()create()之间进行选择取决于您:您是否需要自动装配?

简单地使用create()告诉PHP-DI只需要new FooService()来创建服务。如果那还不够,那就好了。如果您的服务具有依赖关系,则可以依赖自动装配(使用autowire())或定义依赖关系以使用create()手动注入。它取决于你。