是否可以将参数传递给Symony2容器构造函数

时间:2012-04-23 19:57:35

标签: dependency-injection symfony containers

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

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

我找到的例子(例如http://symfony.com/doc/current/cookbook/service_container/factories.html)都以静态参数作为参数结束。

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

1 个答案:

答案 0 :(得分:3)

我在理解为什么服务工厂不应该处理您的情况时遇到一些问题。您是否需要返回彼此无关的不同服务类?

我从工厂示例中看到的是,您可以执行以下操作:

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组件的所有内部组件,但我认为如果其他方法不能解决您的问题。

的问候,
马特