Я пытаюсь переопределить какую-то услугу из раздела "поставщик". Следуя этому руководству 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.
Как я могу правильно переопределить функцию?
Попробуйте сбросить определение $ после setclass, чтобы увидеть, что там






Вы должны добавить этот код в src / AppBundle / AppBundle.php:
В функции 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
В противном случае ваш compilerpass не загружен.
Для конкретного случая переопределения службы единственное, что вам нужно сделать, это определить новую службу в вашем пакете (или папке приложения) 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.Итак, при переопределении службы вам необходимо создать новое определение, которое сохраняет то же имя, что и исходное, но с другим классом для создания экземпляра. Обратите внимание, что с точки зрения совместимости рекомендуется реализовать те же интерфейсы, что и оригинал, а именно: следуйте тем же соглашениям, что и исходная служба, чтобы гарантировать совместимость.
Извините за мой английский, надеюсь, это поможет
Использование служебного 'ключевого' синтаксиса (my.very.own.service.) помогло мне. В последнее время следил за официальной документацией, но это не совсем помогло.
Можете ли вы проверить, что у вас есть правильный идентификатор службы, который нужно переопределить?