如何使用Symfony2访问控制器外部的服务?

问题描述

| 我正在建立一个非常依赖第三方API的网站,因此我认为将API包装器作为服务打包是很有意义的,但是我开始寻找对访问有帮助的实例在控制器之外(例如在实体存储库中)。 同样与此相关的是,能够访问控制器外部(同样在实体存储库中)的配置值将很有用。 谁能告诉我这是否可行,是否有建议的方法来做这种事情? 谢谢你的帮助     

解决方法

Symfony发行版严重依赖于依赖项注入。这意味着通常,依赖项会通过构造函数,setter或其他方式(例如,对属性的反射)直接注入到您的对象中。然后,API包装器服务就是应用程序其他对象的依赖项。 话虽这么说,很难将这个服务注入实体存储库的构造函数中,因为它已经需要一些其他参数,并且我认为由于我们请求实体存储库的方式而无法注入它们。 您可以做的是创建另一个服务,该服务将负责您将要在实体存储库中进行的工作。这样,您将能够注入实体管理器,该实体管理器将用于检索实体存储库,自定义服务以及保存配置值的其他服务(还有其他共享配置值的方法)。 在我的用例中,我使用包装Facebook API调用的Facebook帮助程序服务。然后将该服务注入到我需要的地方。我的实体存储库仅负责进行数据库调用,因此它仅接收所需的参数,而不接收整个依赖项。因此,它不会接收帮助程序,而只会接收执行请求所需的参数,例如Facebook用户ID。我认为,这是这样做的方法,因为我认为实体存储库不应该依赖于此类帮助对象。 这是一个使用YAML作为配置的小示例:
# app/config/config.yml
services:
  yourapp.configuration_container:
    class: Application/AcmeBundle/Common/ConfigurationContainer
    # You could inject configurations here      

  yourapp.api_wrapper:
    class: Application/AcmeBundle/Service/ApiWrapperService
    # Inject other arguments if needed and update constructor in consequence    

  yourapp.data_access:
    class: Application/AcmeBundle/Data/Access/DatabaseAccessService
    arguments: 
      entityManager: \"@doctrine.orm.entity_manager\"
      apiWrapperService: \"@yourapp.api_wrapper\"
      configuration: \"@yourapp.configuration_container\"

# Application/AcmeBundle/Common/ConfigurationContainer.php
public ConfigurationContainer
{
   public function __construct()
   {
       // Initialize your configuration values or inject them in the constructor
   }
}        

# Application/AcmeBundle/Service/ApiWrapperService.php
public ApiWrapperService
{
   public function __construct()
   {
       // Do some stuff
   }
}

# Application/AcmeBundle/Data/Access/DatabaseAccessService.php
public DatabaseAccessService
{
    public function __construct(EntityManager $entityManager,ApiWrapperService $apiWrapperService,ConfigurationContainer $configuration)
    {
        ...
    }
}
config.yml文件中的at符号(@)意味着Symfony应该注入另一个服务,该服务具有在at符号之后定义的ID,而不是简单的字符串。对于配置值,正如我之前所说,还有其他方法可以达到相同的目标,例如使用参数或捆绑扩展。使用bundle扩展名,您可以直接在config.yml中定义配置值,然后您的bundle将读取它们。 总之,这应该为您提供注入服务的总体思路。这里是有关该主题的一小部分文档。很多链接使用XML服务定义而不是YAML定义,但是您应该能够很容易地理解它们。 Symfony官方DI Fabien Potencier关于DI的文章 理查德·米勒(Richard Miller)关于DI的文章(请在他的博客中查看其他DI文章) 请注意,我提供的配置适用于Symfony2的Beta1。我尚未更新到Beta2,因此可能有些东西无法正常使用,因为它们在Beta2版本中。 我希望这将帮助您定义问题的最终解决方案。如果您需要澄清或其他任何信息,请随时询问其他问题。 问候, 马特     ,我会将这种行为包装在Symfony服务中(例如经理)。 我不会将任何参数或逻辑注入实体存储库,因为它们应主要用于通过对象管理器查询来获取数据。 我会将逻辑放入服务中,如果服务需要数据库访问,它将调用实体存储库以获取数据。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...