Symfony:覆盖 Symfony 服务(编译器传递)

Maz*_*zzy 5 php symfony

我在 symfony 2.7 上,需要覆盖 Symfony\Component\Asset\UrlPackage

我看过http://symfony.com/doc/current/cookbook/bundles/override.htmlhttp://symfony.com/doc/current/cookbook/service_container/compiler_passes.html 但无法得到它在职的。

我在我的包 MyApp\CoreBundle\Overrides\UrlPackage 中创建了一个文件;我将 UrlPackage 注册为服务并添加了一个功能:

public function process(ContainerBuilder $container)
{
    $definition = $container->getDefinition('assets.url_package');
    $definition->setClass('MyApp\CoreBundle\Overrides\UrlPackage');
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我调用$this->has('assets.url_package')任何控制器,它返回 false。我确实从 Symfony 下的服务文件中获取了它:

<service id="assets.url_package" class="Symfony\Component\Asset\UrlPackage" abstract="true">
        <argument /> <!-- base URLs -->
        <argument type="service" /> <!-- version strategy -->
        <argument type="service" id="assets.context" />
    </service>
Run Code Online (Sandbox Code Playgroud)

如果我运行php app/console debug:container,来自 symfony 的 UrlPackage 不在那里,但是,如果我在 vendor/*/UrlPackge 文件中更改某些内容,它确实有效

有人可以指出我正确的方向吗?

Rva*_*aak 5

装饰服务是您正在寻找的东西:

bar:
    public: false
    class: stdClass
    decorates: foo
    arguments: ["@bar.inner"]
Run Code Online (Sandbox Code Playgroud)

您可以在自己的服务中注入原始服务,并实现原始接口使其兼容。

http://symfony.com/doc/2.7/service_container/service_decoration.html