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

6

我使用的是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 但无法使其正常工作。

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

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

奇怪的是,如果我在任何控制器中调用$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>

如果我运行php app/console debug:container,Symfony的UrlPackage不在其中,但是,如果我更改vendor/*/UrlPackge文件中的内容,它会起作用。请问有人能指点一下吗?

2
不应该使用编译器来覆盖现有的服务 - 服务定义应该足够了。你确定你正在使用正确的服务ID吗?我正在使用2.6版本,在这个版本中它是 templating.asset.url_package - mickadoo
1
是的,它们已经更改了,所有的模板.assets设置也已被弃用,assets现在是独立的东西,而且,urlpackage是一个可以被覆盖的参数,但现在不行了 :( - http://symfony.com/blog/new-in-symfony-2-7-the-new-asset-component - Mazzy
2个回答

5

2

Symfony 5.1+

Symfony 5.1+提供了更简单的服务装饰方式:

在之前的Symfony版本中,您需要使用语法修饰服务ID + .inner来引用该服务。当使用PHP类作为服务ID时,在YAML/XML中快速变得繁琐。因此,在Symfony 5.1中,我们将这个特性简化为始终使用.inner来引用原始服务。

@source: https://symfony.com/blog/new-in-symfony-5-1-simpler-service-decoration

# config/services.yaml

services:
    App\MyService: ~

    # Before
    App\SpecialMyService:
        decorates: App\MyService
        arguments: ['@App\SpecialMyService.inner']

    # After
    App\SpecialMyService:
        decorates: App\MyService
        arguments: ['@.inner'] # <--- the service ID is no longer needed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接