symfony - Service(使用服务工厂)返回不同类型的对象

标签 symfony symfony-2.2

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

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:错误:无法实例化抽象类 .

所以我有两个问题:
  • 为什么 DI 系统尝试实例化我的类,而不是返回我的工厂方法的结果?
  • 有没有办法实现我需要的东西(简洁明了)?

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

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

    最佳答案

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

    When you specify the class to use for the factory (via factory_class) the method will be called statically. If the factory itself should be instantiated and the resulting object's method called (as in this example), configure the factory itself as a service



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

    关于symfony - Service(使用服务工厂)返回不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15642572/

    相关文章:

    symfony - 使用外部 REST API 在 Symfony 3 中自定义身份验证

    symfony - SonataAdminBundle 根据用户显示仪表板 block

    symfony-2.2 - 我正在尝试使用 Sonata Admin Bundle 安装 Symfony 2.2,但我从 Composer : 收到以下错误

    php - 如何在 Symfony2 项目中正确集成第 3 方库

    mongodb - 如何为 HWIOAuthBundle 编写用户提供程序

    php - 查询生成器中的 Symfony Doctrine if 语句

    php - 选项 "label "不存在

    database - 来自现有数据库的 Symfony2 Doctrine2 映射(异常(exception))

    symfony - 使用 Doctrine 为每个 fork 子进程单独的数据库连接

    fosuserbundle - 双击确认链接时是否会进入 fosuserbundle?