如何在symfony2包中实现策略模式?

时间:2017-03-08 16:05:24

标签: php symfony dependency-injection

假设我们有一个Symfony包,其中包含一个具有由接口定义的依赖关系的服务(策略模式)。我也有几个在同一个bundle中定义的接口(即策略)的实现。每个策略还可能具有我需要进一步配置的各种进一步依赖性。所以我在bundle中的services.yml可能看起来像这样:

services:
  my_service:
    class: MyBundle\Services\MyService
    arguments: ['@my_strategy']
  my_strategy_service_1:
    class: MyBundle\Services\MyStrategyService1
  my_strategy_service_2:
    class: MyBundle\Services\MyStrategyService2
    argument: [@my_memcache]

我可以在应用程序的config.yml中选择实现。

services:
  my_strategy:
    alias: my_strategy_service_2
  my_memcache:
    class: Memcached
    calls:
      - [ addServer, [%memcache_host%, %memcache_port%] ]

让我们坚持这个例子,让我们改变实施。如果我在应用程序中的config.yml中写入:

services:
  my_strategy:
    alias: my_strategy_service_1

它仍然不幸地要求我定义" my_memcache"服务,即使这次没有使用,但只在捆绑中定义。我该如何处理这种情况?我是否可以强制检查" my_strategy_service_2"的依赖关系?只有它真的被使用过?

1 个答案:

答案 0 :(得分:0)

通常我会实现"注册"在上下文和策略使用之间:

  1. 定义所有可能的策略(服务)并标记它们
  2. 定义一个寄存器我已经通过标签(带有compiler pass
  3. 获取所有可能的策略(服务)
  4. 通过寄存器检索策略(通过注入的配置参数或在调用函数时传递它以查找正确的策略)
  5. 使用策略
  6. 希望它清楚