Symfony 4.1组件-依赖注入问题

时间:2018-09-07 11:09:17

标签: php symfony dependency-injection

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

我正在尝试使用Symphony依赖项注入组件将服务注入到控制器(或其他服务)中,但是我不知道如何实现,因为Symphony文档比框架组件更适合使用框架。 / p>

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

通过$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实施吗?一个好的工作例子就足够了。或者只是将您的评论写在我的要点上,我会设法解决。

2 个答案:

答案 0 :(得分:1)

根据您的问题和评论,我认为您需要做的就是修复自动装配。

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'
    # ...


在哪里继续阅读

答案 1 :(得分:-1)

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

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

services:
    _defaults:
        public: true

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

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