我需要创建一个使用其他工厂服务的服务,并返回不同类型的对象 以下是我的服务定义:
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%
获取方法会根据请求参数返回不同的对象
我的%games.search.base.class%
是抽象的
我的目标是 - 当我打电话时
$this->get("games.search");
我想获得工厂方法的结果。但是当我运行代码时,我收到一个错误: FatalErrorException:错误:无法实例化抽象类。
所以我有两个问题:
更新:我的代码部分有一个错误,此处未显示。除了这两个搜索服务外,我还为每种搜索类型提供了服务,并从工厂返回这些服务。但是在这些服务的定义中,我使用了我的基类(它是抽象的)作为一个类。
很好的结论是 可以从工厂返回不同类型的对象。
答案 0 :(得分:2)
从这里开始:http://symfony.com/doc/current/components/dependency_injection/factories.html
指定要用于工厂的类(通过factory_class) 该方法将被静态调用。 如果应该实例化工厂本身并调用生成的对象的方法 (如本例所示),将工厂本身配置为服务
为了将容器注入工厂,您需要使工厂可以实现(不是抽象),或者将容器作为参数传递给静态get方法。我不知道有任何方法可以将服务声明为静态。