【问题标题】:Symfony: Overriding Symfony service ( compiler pass )Symfony:覆盖 Symfony 服务(编译器通过)
【发布时间】:2015-07-20 07:35:12
【问题描述】:

我使用的是 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');
}

奇怪的是,如果我在任何控制器中调用 $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 文件中更改某些内容,它确实可以工作

有人能指出正确的方向吗?

【问题讨论】:

  • 不必使用编译器通行证来覆盖现有服务 - 服务定义就足够了。您确定您使用的是正确的服务 ID 吗?我使用的是 2.6,在这个版本中它是 templating.asset.url_package
  • 是的,他们改变了这一点,所有的 templating.assets 设置也被弃用了,资产现在是它自己的东西,而且,urlpackage 是一个可以被覆盖的参数,现在它不是:( - symfony.com/blog/new-in-symfony-2-7-the-new-asset-component

标签: php symfony


【解决方案1】:

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

bar:
    public: false
    class: stdClass
    decorates: foo
    arguments: ["@bar.inner"]

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 1970-01-01
      • 2017-11-03
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      相关资源
      最近更新 更多