Symfony 服务应该如何包装?
How should Symfony services be wrapped?
我的应用程序需要一个缓存加热器,但为了让事情变得有趣,这个缓存加热器依赖于 Symfony 路由缓存加热器。
在加载路由之前,我自己的代码需要运行,然后在加载之后,我需要对生成的路由名称执行更多操作。为此,我需要用我自己的实现来包装内置路由加热器。
替换原来的服务很简单,但是如何将该服务注入到我的替换服务中呢?
内置 class 已将 router
服务注入到构造函数中。如果我在自己的代码中复制这个(调用 new RouteCacheWarmer
),它可能会破坏也替换了该服务的第 3 方捆绑包。将服务作为我自己的别名,如果另一个包也这样做,也可能会中断。
我的目标是 运行 我自己的缓存暖器,代替路由缓存暖器,但是 运行 我自己的现有暖器。同时与其他可能修改了内置服务的捆绑包一起玩得很好。
您可以使用链式路由器,这样您就可以让 Symfony 路由器做自己的事情,然后 运行 您的路由器完全分开。 Symfony CMF 在 RoutingBundle component 中提供了这样的功能。
事实证明,Symfony 在 2.5 版本中添加了此功能。它被称为 service decoration。
bar:
public: false
class: stdClass
decorates: foo
arguments: ["@bar.inner"]
这会将 bar
服务设置为 foo
的别名,同时将 foo
服务重命名为 bar.inner
使其可用于注入。当第 3 方捆绑包替换 foo
服务时,它所做的更改不应影响 bar
服务。
我的应用程序需要一个缓存加热器,但为了让事情变得有趣,这个缓存加热器依赖于 Symfony 路由缓存加热器。
在加载路由之前,我自己的代码需要运行,然后在加载之后,我需要对生成的路由名称执行更多操作。为此,我需要用我自己的实现来包装内置路由加热器。
替换原来的服务很简单,但是如何将该服务注入到我的替换服务中呢?
内置 class 已将 router
服务注入到构造函数中。如果我在自己的代码中复制这个(调用 new RouteCacheWarmer
),它可能会破坏也替换了该服务的第 3 方捆绑包。将服务作为我自己的别名,如果另一个包也这样做,也可能会中断。
我的目标是 运行 我自己的缓存暖器,代替路由缓存暖器,但是 运行 我自己的现有暖器。同时与其他可能修改了内置服务的捆绑包一起玩得很好。
您可以使用链式路由器,这样您就可以让 Symfony 路由器做自己的事情,然后 运行 您的路由器完全分开。 Symfony CMF 在 RoutingBundle component 中提供了这样的功能。
事实证明,Symfony 在 2.5 版本中添加了此功能。它被称为 service decoration。
bar:
public: false
class: stdClass
decorates: foo
arguments: ["@bar.inner"]
这会将 bar
服务设置为 foo
的别名,同时将 foo
服务重命名为 bar.inner
使其可用于注入。当第 3 方捆绑包替换 foo
服务时,它所做的更改不应影响 bar
服务。