我希望能够通过配置参数连接服务,以便我可以在开发环境中使用 Web 服务客户端的模拟实现,并且可以在产品环境中使用正确的客户端。
这是我的 services.xml 中的一个片段:
<parameters>
...
<parameter key="api_client.api_service.id">ic_domain_security.api_mock_service</parameter>
...
</parameters>
<services>
...
<service id="ic_domain_security.api_client"
class="%api_client.class%"
public="true">
<tag name="monolog.logger" channel="domainApiClient"/>
<argument type="service" id="%api_client.api_service.id%"/>
<call method="setLogger">
<argument type="service" id="logger" on-invalid="null"/>
</call>
</service>
<service id="ic_domain_security.api_restful_webservice"
class="IC\DomainSecurityBundle\ApiClient\ApiRestfulWebService"
public="false">
<tag name="monolog.logger" channel="domainApiRestfulWebService"/>
<argument>%ic_domain_security.service_url%</argument>
<argument type="service" id="logger" on-invalid="null"/>
</service>
<service id="ic_domain_security.api_mock_service"
class="IC\DomainSecurityBundle\Tests\Mock\ApiMockService"
public="false">
<call method="setLogger">
<argument type="service" id="logger" on-invalid="null"/>
</call>
</service>
...
</services>
线路<argument type="service" id="%api_client.api_service.id%"/>
正在尝试定义要基于参数传递的服务。所以我最终试图推出 api_client.api_service.id
配置文件的参数。
不幸的是,似乎无法使用参数定义服务 ID,并且我收到以下错误:
ServiceNotFoundException: The service "ic_domain_security.api_client" has a dependency on a non-existent service "%api_client.api_service.id%".
是否有办法执行我上面解释的操作,以便可以使用配置参数传递服务 ID?
最佳答案
完成您想要做的事情的最佳方法是为您的包定义语义配置。无论如何,我认为如果不编写一些 PHP 代码就无法做到这一点。
这意味着您应该编写一个配置类和一个依赖注入(inject)扩展类。这是一个相当简单的过程,尽管 Symfony2 文档中没有详尽记录。我的建议是采用一些简单的 bundle (例如,我在阅读 FOSUserBundle 中学到了很多)并了解他们如何定义其配置。
Here you can find an introduction到 DIC 扩展系统。
关于symfony - 使用配置参数在 DIC 中连接 Symfony2 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210289/