Symfony 3.4。无法覆盖服务

时间:2018-04-23 15:15:29

标签: php symfony symfony-3.4

我试图覆盖"供应商"部分。按照本指南https://symfony.com/doc/3.4/bundles/override.html制作了此代码

namespace AppBundle\DependencyInjection\Compiler;

use AppBundle\Service\Subscriber;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class OverrideServiceCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $definition = $container->getDefinition('MyOldService');
        $definition->setClass(Subscriber::class); //my new service class
    }
}

我在" AppBundle \ Service \ Subscriber"上创建了一个订阅者课程。并试图覆盖一个动作:

<?php

namespace AppBundle\Service;

class Subscriber
{
   public function the_same_name_of_function_from_vendor()
   {
       dump('I am a new function!');die;
       return new Response('ok');
   }
}

但没有任何开心,symfony继续称呼来自&#34;供应商&#34;部分。

如何正确覆盖该功能?

2 个答案:

答案 0 :(得分:4)

您必须在src / AppBundle / AppBundle.php中添加此代码:

在function build()

$container->addCompilerPass(new OverrideServiceCompilerPass());

所有课程:

class AppBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);

        $container->addCompilerPass(new OverrideServiceCompilerPass());
    }
}

https://symfony.com/doc/3.4/service_container/compiler_passes.html

否则你的compilepass没有加载。

答案 1 :(得分:1)

对于覆盖服务的特定情况,您唯一需要做的就是在您的捆绑(或应用程序文件夹)services.yml中定义一个新服务

perl

当然有一些规则:

  • 服务名称必须与供应商中的名称完全相同。因此,我上面写的那个覆盖了LexikJWTAuthentication供应商中名为 lexik_jwt_authentication.security.guard.jwt_token_authenticator: class: SeguridadBundle\DependencyInjection\MyJWTTokenAuthenticator arguments: ["@lexik_jwt_authentication.jwt_manager", "@event_dispatcher", "@lexik_jwt_authentication.extractor.chain_extractor"] 的另一个服务。
  • 指定的类将是具有您自己实现的类。

因此,在覆盖服务时,您需要创建一个与原始名称保持相同名称的新定义,但具有不同的实例化类。 请注意,对于兼容性问题,建议实现与原始相同的接口,即:遵循与原始服务相同的约定,以保证兼容性。

对不起我的英语,我希望有所帮助