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

Symfony 3.3依赖项注入更改

郭麒
2023-03-14

在Synfony 3.3中,DI的新最佳实践

是使用普通构造函数依赖项注入(或控制器中的“操作”注入),而不是通过$this获取公共服务-

如官方留档所见

因此,无需指定服务,因为我们可以在类控制器中键入提示:

class InvoiceMailer
{
    private $generator;

    public function __construct(InvoiceGenerator $generator)
    {
        $this->generator = $generator
    }

    // ...
}

这似乎工作得很好,但如果我扩展了一个类并在构造函数中添加了更多参数呢???

use Symfony\Component\HttpKernel\Exception\HttpException;

class MyClass extends HttpException
{
    private $generator;

    public function __construct(InvoiceGenerator $generator, \Exception $previous = null, array $headers = [], $code = 0)
    {
        $this->generator = $generator;
        $statusCode      = $generator->getStatusCode();
        $message         = $generator->getTitle();

        parent::__construct($statusCode, $message, $previous, $headers, $code);
    }

    // ...
}

现在我得到一个循环引用错误:

[Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException]检测到服务“AppBundle\service\MyClass”的循环引用,路径:“AppBundle\service\MyClass”-

那么,在这种情况下,最佳实践是什么??

谢谢

共有1个答案

祝昊东
2023-03-14

在这种情况下,您可能必须将服务显式定义为\Exc0019$以前的参数实际上是MyClass的父类(通过HttpExc0019),因此自动拥有方法尝试注入/创建MyClass<的实例/code>再次对这个论点,结果:《循环参考》。

这是发生在你身上的事情的抽象:

namespace App\Foo;

class MyClass extends \Exception
{
    public function __construct(\Exception $previous = null)
    {
    }
}

相同的错误,因此您可以通过向此参数传递null值来解决此问题:

# service.yml
services:
    # ...
    App\Foo\MyClass: 
        $previous: ~

或者在编译器过程或DI扩展中手动更改其定义。

 类似资料:
  • 问题内容: 我想将依赖项注入。但是,我的方法不起作用。我可以看到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. 依赖注入是一个很强大的机制,该机制可以帮

  • 简介 Hyperf 默认采用 hyperf/di 作为框架的依赖注入管理容器,尽管从设计上我们允许您更换其它的依赖注入管理容器,但我们强烈不建议您更换该组件。 hyperf/di 是一个强大的用于管理类的依赖关系并完成自动注入的组件,与传统依赖注入容器的区别在于更符合长生命周期的应用使用、提供了 注解及注解注入 的支持、提供了无比强大的 AOP 面向切面编程 能力,这些能力及易用性作为 Hyper

  • 出自维基百科 Wikipedia: 依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。 这句解释让依赖注入的概念听起来比它实际要复杂很多。依赖注入通过构造注入,函数调用或者属性的设置来提供组件的依赖关系。就是这么简单。