Php Symfony 4.1组件-依赖项注入问题
我正在用PHP重构旧的应用程序 我试图使用Symphony依赖注入组件将服务注入控制器(或其他服务),但我不知道如何实现这一点,因为Symphony文档比框架组件更适合使用框架 我已经有了自己的内核,包含所有服务和控制器的容器(控制器已经注册为服务)。我的控制器从Php Symfony 4.1组件-依赖项注入问题,php,symfony,dependency-injection,Php,Symfony,Dependency Injection,我正在用PHP重构旧的应用程序 我试图使用Symphony依赖注入组件将服务注入控制器(或其他服务),但我不知道如何实现这一点,因为Symphony文档比框架组件更适合使用框架 我已经有了自己的内核,包含所有服务和控制器的容器(控制器已经注册为服务)。我的控制器从symfony/frameworkbundle扩展AbstractController。所以我现在唯一能做的就是: 通过$this->container->Get('service\u id')从容器中获取服务,但构造函数中的服务是否将
symfony/frameworkbundle
扩展AbstractController。所以我现在唯一能做的就是:
通过$this->container->Get('service\u id')
从容器中获取服务,但构造函数中的服务是否将类作为参数
public function __constructor(SomeClass $someClass)
然后我得到一个例外:
编译容器时,“App\V2\Service\TestService”服务或别名已被删除或内联。您应该将其公开,或者停止直接使用容器,改用依赖项注入
如果我更改配置以公开所有服务,则:
函数APP\V2\Service\TestService::\uu construct()的参数太少,传递了0个,预期正好是1个
我准备了一个要点,以便更好地了解我所说的内容:
有人能帮助我使用Symfony组件(不是Symfony框架)实现DI吗?好的工作示例就足够了。或者请把你的话放在我的要点上,我试着解决这个问题。
您需要更改服务的默认配置以使其公开:
services:
_defaults:
public: true
但更优雅的访问服务的方法是将它们注入控制器操作:
public function myAction(Request $request, TestService $service)
Symfony 4/5自动接线方式
根据你的问题和评论,我认为你所需要做的就是修复自动布线
Symfony 4路操作简单:自动连接所有服务和参数,无需手动设置(如果可能)
要将其应用到您的示例中,这将是适合您的需要和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%'
APP\V2\:
resource: '../src/app/V2/*'
exclude: '../src/app/V2/{Script, Trait}'
# symfony services - you still have to setup 3rd paryt services manually
Symfony\Component\DependencyInjection\ParameterBag\ContainerBag:
arguments:
- '@service_container'
# ...
在哪里继续阅读
APP\V2\Service\T estService
看起来怎么样?你在哪里注册它?另外,你可以像这样简化配置:@TomášVotruba我没有注册服务,它应该自动注册,因为autowire:true
。我更新了gist,所以您可以检查TestService.php的外观。好的,我做了一些更改,就像您在gist中做的一样(ControllerResolver和ArgumentResolver现在应该是公共的,否则我不能在框架类中使用它们)。现在看起来好多了,但我还有另外一个问题:1。如果在defaultspublic:true
中进行服务内配置,则无法自动连接具有构造函数内标量类型参数(字符串、int、数组)的服务<代码>无法自动连线服务“APP\V2\service\API”:方法“\uu construct()”的参数“$facebookUserId”没有类型提示,您应该显式配置其值。2如果public:false
-控制器“APP\V2\Controller\API\SocialNetworkController::loginAction()”要求您为“$testService”提供一个值论点要么该参数可为null且未提供null值,要么未提供默认值,要么是因为该参数后面有一个非可选参数。
因此,看起来服务仍然没有注入。