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

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

Можете ли вы проверить, что у вас есть правильный идентификатор службы, который нужно переопределить?

JacobW 23.04.2018 17:20

Попробуйте сбросить определение $ после setclass, чтобы увидеть, что там

Eakethet 23.04.2018 17:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
2
920
2

Ответы 2

Вы должны добавить этот код в 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.) помогло мне. В последнее время следил за официальной документацией, но это не совсем помогло.

DeEgge 25.06.2020 15:29

Другие вопросы по теме