4

我需要创建一个服务,它使用另一个工厂服务,并返回不同类型的对象。
这是我的服务的定义:

services:
    games.search_factory:
        class: %games.search_factory.class%
        calls:
           - [ setContainer, ["@service_container"] ]

    games.search:
        class: %games.search.base.class%
        factory_service: games.search_factory
        factory_method: get

我的%games.search_factory.class% get方法根据请求参数返回不同的对象。
%games.search.base.class%的是抽象的。
我的目标是 - 当我打电话时

$this->get("games.search");  

我想得到工厂方法的结果。但是当我运行代码时,我得到一个错误:FatalErrorException: Error: Cannot instantiate abstract class

所以我有两个问题:

  1. 为什么 DI 系统尝试实例化我的类,而不是返回我的工厂方法的结果?
  2. 有没有办法实现我需要的东西(简洁明了)?

更新:我在代码部分有一个错误,这里没有显示。除了这两个用于搜索的服务之外,我还为每种搜索类型提供了一个服务,并从工厂返回了这些服务。但是在这些服务的定义中,我使用了我的基类(它是抽象的)作为一个类。

很好的结论是可以从工厂返回不同类型的对象。

4

1 回答 1

2

从这里:http ://symfony.com/doc/current/components/dependency_injection/factories.html

当您指定要用于工厂的类时(通过 factory_class),该方法将被静态调用。如果应实例化工厂本身并调用生成的对象的方法(如本例所示),请将工厂本身配置为服务

为了将容器注入您的工厂,您需要使工厂可实例化(非抽象)或将容器作为参数传递给静态 get 方法。我不知道有什么方法可以将服务声明为静态的。

于 2013-03-26T18:56:28.383 回答