Symfony 4.1 组件 - 依赖注入问题



我正在重构PHP中的旧应用程序。

我正在尝试使用Symfony依赖注入组件将服务注入控制器(或其他服务(,但我不知道如何实现这一点,因为symphony文档比框架组件更适合使用框架。

我已经有了自己的内核,包含所有服务和控制器的容器(控制器已经注册为服务(。我的控制器从symfony/frameworkbundle扩展抽象控制器。所以我现在唯一能做的就是:

通过$this->container->get('service_id')从容器中获取服务,但如果构造函数中的服务将类作为参数

public function __constructor(SomeClass $someClass)

然后我得到这个异常:

编译容器时,已删除或内联了"App\V2\Service\TestService"服务或别名。应将其公开,或者停止直接使用容器并改用依赖项注入。

如果我更改配置以使所有服务公开,则:

参数太少,无法运行 APP\V2\Service\TestService::__construct((,0 通过,正好 1 个预期

我准备了一个要点,以便更好地了解我在说什么: https://gist.github.com/miedzwin/49bac1cc1d5270d3ba1bfcf700abf864

有人可以帮助我使用Symfony组件(不是Symfony框架(实现DI吗?良好的工作示例就足够了。或者只是请把你的评论放在我的要点上,我试图解决这个问题。

Symfony 4/5 自动布线方式

从您的问题和评论中,我认为您需要做的就是修复自动布线。

Symfony 4-way很简单:自动连接所有服务和参数,无需手动设置(如果可能的话(。

为了将其应用于您的示例,这将是适合您的需求和Symfony 4的最佳配置:

services:
_defaults:
# pass service dependencies to constructors by default
autowire: true
# add known tags (for commands, event subscribers etc) by default
autoconfigure: true

# to make using tests, bin files and another simpler
public: true
# autowiring of string/array/int parameters to constructors
# this fixes cases like "argument "$facebookUserId" of method "__construct()" has no type-hint, you should configure its value explicitly"
bind:
# $constructorVariableName: %parameter% in config
$facebookUserId: '%facebook_user_id%'
APPV2:
resource: '../src/app/V2/*'
exclude: '../src/app/V2/{Script, Trait}'
# symfony services - you still have to setup 3rd paryt services manually
SymfonyComponentDependencyInjectionParameterBagContainerBag:
arguments:
- '@service_container'
# ...

在哪里继续阅读

  • 将参数传递给服务
  • 如何在 Symfony 3.3 中重构新的依赖注入功能

https://symfony.com/doc/current/service_container.html#fetching-and-using-services

您需要更改服务的默认配置以使其公开:

services:
_defaults:
public: true

但是访问服务的更优雅方法是将它们注入控制器操作中:

public function myAction(Request $request, TestService $service)