Симфони 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 продолжает вызывать функцию из секции "vendor".

Как я могу правильно переопределить функцию?


person SomethingWeird    schedule 23.04.2018    source источник
comment
Можете ли вы убедиться, что у вас есть правильный идентификатор службы для переопределения?   -  person JacobW    schedule 23.04.2018
comment
Попробуйте сбросить $definition после setclass, чтобы посмотреть, что там   -  person Eakethet    schedule 23.04.2018


Ответы (2)


Вы должны добавить этот код в src/AppBundle/AppBundle.php:

В функции сборки()

$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

В противном случае ваш компилятор не загружается.

person Joris Saenger    schedule 23.04.2018

В конкретном случае переопределения службы единственное, что вам нужно сделать, это определить новую службу в вашем пакете (или папке приложения) services.yml, как это

       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"]

Есть, конечно, некоторые правила:

  • Имя службы должно быть в точности таким же, как у поставщика. Итак, тот, что я написал выше, переопределяет другой сервис под названием lexik_jwt_authentication.security.guard.jwt_token_authenticator в поставщике аутентификации LexikJWTA.
  • Указанный класс будет классом с вашей собственной реализацией.

Таким образом, при переопределении службы вам необходимо создать новое определение, сохраняющее то же имя, что и исходное, но с другим классом для создания экземпляра. Обратите внимание, что в вопросах совместимости рекомендуется реализовать те же интерфейсы, что и оригинал, то есть: следовать тем же соглашениям, что и исходный сервис, чтобы гарантировать совместимость.

Извините за мой английский, и я надеюсь, что это поможет

person Carlos Gonzalez    schedule 25.04.2018
comment
Использование сервисного «ключевого» синтаксиса (my.very.own.service.) помогло мне. Недавно, если следовал официальной документации, но это не совсем помогло. - person DeEgge; 25.06.2020