当前位置: 首页 > 知识库问答 >
问题:

Symfony 4.1组件-依赖项注入问题

薛弘壮
2023-03-14

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

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

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

通过$this从容器获取服务-

public function __constructor(SomeClass $someClass)

然后我得到一个例外:

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

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

函数APP\V2\Service\TestService::\uu construct()的参数太少,传递了0个,预期正好是1个

我准备了一个要点,以便更好地了解我所说的内容:https://gist.github.com/miedzwin/49bac1cc1d5270d3ba1bfcf700abf864

有人能帮我一点使用Symfony组件(不是Symfony框架)的DI实现吗?好的工作榜样就足够了。或者请把你的话放在我的要点上,我试着解决这个问题。


共有2个答案

宇文鸿振
2023-03-14

https://symfony.com/doc/current/service_container.html#fetching-以及使用服务

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

services:
    _defaults:
        public: true

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

public function myAction(Request $request, TestService $service)
苏阳州
2023-03-14

根据你的问题和评论,我认为你所需要做的就是修复自动布线。

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'
    # ...
  • 向服务传递参数
  • 如何在Symfony 3.3中重构新的依赖注入功能
 类似资料:
  • 然而,Eclipse告诉我“没有bean可以被注入到注入点[JSR-299§5.2.1]”。我做错了什么?你有没有看到我缺少的东西。如有任何帮助,我们将不胜感激。 谢谢!!

  • 供给方组件: 注入方组件: 浏览器中可以正常展示: 但是如果在供给方组件中,更换ElMessage和provide的顺序,如下图: 浏览器中就无法正常渲染,并且控制台报警告: 请问这是什么原因呢? 备注: "element-plus": "^2.3.12" "vue": "^3.3.4"

  • 问题内容: 我想将依赖项注入。但是,我的方法不起作用。我可以看到Spring正在调用我的setter方法,但是稍后在调用when时,该属性为。 这是我的设置: ServletContextListener: web.xml :(这是文件中的最后一个侦听器) applicationContext.xml: 输出: 实现此目的的正确方法是什么? 问题答案: 我通过删除侦听器bean并为我的属性创建了一

  • 我想向Springbean注入一个单例对象依赖关系。问题是我无法访问和修改要注入其对象的类。让我描述一下这个例子。 所以我有我的接口,以及这个接口的实现,如下所示。 然后在我的配置类中,我正在创建一个bean,但是我需要在构造函数中向它传递对象,问题是我不能使成为bean,因为它来自外部包,我不能修改它。 所以我想做的是,能够将/autowire参数传递给bean。目前IntelliJ给我一个错误

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮