【问题标题】:Is it possible to pass arguments to Symony2 container constructor是否可以将参数传递给 Symony2 容器构造函数
【发布时间】:2012-04-23 19:57:34
【问题描述】:

在 Symfony2 中创建服务容器时,您主要将“静态”参数(如其他类等)传递给它的构造函数。

但是我想创建一个工厂,因此我需要能够将动态参数传递给服务构造函数。

我发现的示例(例如http://symfony.com/doc/current/cookbook/service_container/factories.html)最终都使用静态参数作为参数。

但是,如果我希望我的工厂根据(例如)用户输入来决定返回哪个对象,我该怎么办?

【问题讨论】:

    标签: dependency-injection symfony containers


    【解决方案1】:

    我在理解为什么服务工厂不适用于您的案例时遇到了一些问题。是否需要返回互不相关的不同服务类?

    我从工厂示例中看到的是,您可以这样做:

    class NewsletterFactory
    {
        public function __constructor(...) 
        {
            // Receive arguments needed to create the service below
        }
    
        public function get()
        {
            // Say the variable $userInput exists and is derived from constructor
            if ($userInput === 'string') 
                return new NewsletterManager($dynamicArgument1);
    
            if ($userInput === 'integer') 
                return new AnotherNewsletterManager($dynamicArgument2);
    
            return new DefaultNewsletterManager();
        }
    }
    

    现在,如果这不符合您的需求。您还可以创建一个服务,例如 CustomFactory,它会返回您需要的内容。返回的不是直接的服务,所以你可以为所欲为。但这会阻止您从依赖容器中请求CustomFactory 创建的对象。

    与此类似的是FormFactory。它是用于实例化表单类型的工厂。但是FormFactory 更强大,因为它与依赖注入标签和编译器通道相结合,它们将每种类型注册到依赖注入系统中,以便它们可以自己检索。我并不完全了解 Form 组件的所有内部结构,但我认为如果其他方法不能解决您的问题。

    问候,
    马特

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2014-11-04
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多