Рейтинг:5

Расширение класса службы файлового журнала модуля contrib отображает ошибку реализации PSR

флаг nl

Я хотел переопределить службу logger.filelog из файлжурнал модуль, чтобы использовать мой собственный парсер.

Произошла ошибка через драш цим и драш кр когда новый пользовательский модуль, который переопределяет службу, включен.

Сайт обнаружил непредвиденную ошибку. Пожалуйста, повторите попытку позже.
Symfony\Component\DependencyInjection\Exception\LogicException: служба 'logger.filelog' для потребителя 'logger.factory' не реализует Psr\Log\LoggerInterface. в Drupal\Core\DependencyInjection\Compiler\TaggedHandlersPass->processServiceCollectorPass() (строка 182 файла /app/docroot/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php).

Структура моих пользовательских модулей выглядит так

custom_module
  - источник
    - Регистратор
      - TestFilelog.php
    CustomModuleServiceProvider.php
  custom_module.info.yml
  custom_module.module

В настоящее время класс поставщика услуг реализовал ServiceModifierInterface и изменил исходный сервис logger.filelog, установив для его класса значение Drupal\custom_module\Logger\TestFilelog.

/**
 * Класс для переопределения службы logger.filelog модуля contrib.
 */
класс CustomModuleServiceProvider реализует ServiceModifierInterface {

  /**
   * {@inheritdoc}
   */
  общедоступная функция изменить (ContainerBuilder $ контейнер) {
    если ($container->has('logger.filelog')) {
      $definition = $container->getDefinition('logger.filelog');
      $definition->setClass('Drupal\custom_module\Logger\TestFilelog');
    }
  }

}

TestFilelog.php

пространство имен Drupal\custom_module\Logger;

используйте Drupal\filelog\Logger\FileLog;

/**
 * Файловый регистратор.
 */
класс TestFileLog расширяет FileLog {

  /**
   * Выводит сообщение в строку.
   *
   * @param смешанный уровень $
   * Уровень серьезности сообщения журнала.
   * @param строка $сообщение
   * Содержание сообщения журнала.
   * массив @param $контекст
   * Контекст сообщения журнала.
   *
   * @возвратная строка
   * Отформатированное сообщение.
   */
  рендер защищенной функции ($ уровень, $ сообщение, массив $ контекст = []): строка {

    $plainString = parent::render($level, $message, $context);

    $ пользовательский_канал = [
      'filter_custom_channel'
    ];

    если (in_array($context['канал'], $custom_channel)) {
      $plainString = $this->parseStrMasking($plainString);
    }
    вернуть $plainString;
  }

  /**
   * Маскируйте личные данные из строк в журналы.
   *
   * @param строка $pureString
   * Строка для анализа.
   *
   * @возвратная строка
   * Строка, которая была замаскирована.
   */
  защищенная функция parseStrMasking(строка $pureString) {
    // По умолчанию возвращается finalString.
    $finalString = $чистая строка;
    
    // Здесь идет пользовательский синтаксический анализ.
    
    вернуть $finalString;
  }

}

я вижу это Drupal\filelog\Logger\FileLog; имеет использовать RfcLoggerTrait; который реализует Пср\лог\логгеринтерфейс, что мне здесь не хватает??

флаг cn
Ваш код отлично работает для меня - вы пытались перезапустить Apache/PHP-FPM?
флаг cn
Однако у вас есть небольшое несоответствие - вы смешиваете регистр `TestFileLog` (это `Testfilelog` в имени файла и изменении службы). Может иметь значение, если вы используете файловую систему с учетом регистра.
Michael Chen avatar
флаг nl
OMG @Clive, ты абсолютно прав! Слава тебе дружище!
Michael Chen avatar
флаг nl
К вашему сведению, прошлой ночью я обнаружил еще один способ переопределить службу модуля contrib через custom_module.services.yml. Это работает, поэтому я использовал его вместо этого. Спасибо за ваши усилия по тестированию и чтению, спасибо!
Рейтинг:2
флаг nl

Как указал @Clive в комментарии выше, у меня было несоответствие в корпусе ТестФайллог и ТестФайлЖурнал. Еще раз спасибо!

Это должно повлиять на то, почему реализация интерфейса не была прочитана Drupal при обработке службы.

С другой стороны, я обнаружил другой подход к переопределению файлжурнал модуль службы, который я взял взамен.

  1. я удалил CustomModuleServiceProvider.php файл
  2. Созданный custom_module.services.yml
  3. имя машины службы должно совпадать с переопределенной службой. (например, logger.filelog)
    Проверять docroot/modules/contrib/filelog/filelog.services.yml

Содержание custom_module.services.yml

Сервисы:
  logger.filelog:
    класс: Drupal\custom_module\Logger\TestFileLog
    аргументы:
      - '@config.factory'
      - '@государство'
      - '@токен'
      - '@datetime.time'
      - '@logger.log_message_parser'
      - '@filelog.file_manager'
    теги:
      - { имя: регистратор }

Ссылка:

  1. Как украсить сервисы — Symfony
  2. Изменение существующих сервисов - Drupal
  3. Переопределение сервисов в Drupal - ПредыдущийСледующий
флаг fr
Такое переопределение службы было бы моим последним выбором. Лучший выбор - это то, как вы это сделали в исходном вопросе, или по оформлению. Причина в том, что определение вашего собственного logger.filelog в файле services.yml никак не указывает на то, что это переопределенная служба — намерение программиста скрыто (была ли ошибка в том, что использовалась ранее названная служба?) . Кроме того, что произойдет, если модуль Filelog загружается *после* вашего модуля — какая служба на самом деле определяется, ваша или служба Filelog? А что произойдет, если другой модуль переопределит logger.filelog?
Michael Chen avatar
флаг nl
О, Боже! В вашем беспокойстве есть смысл, может быть, мне следует вернуть его к исходному формату и проверить, работает ли он.С другой стороны, есть ли другие ресурсы, на которые я могу ссылаться при оформлении службы? Я только читал, что украшение расширяет исходный сервис, но при его реализации я на самом деле не знаю, как мне переопределить исходный сервис с помощью сервиса декорирования. Ваше здоровье!
флаг fr
Это довольно хорошая статья, которая должна помочь: https://www.phase2technology.com/blog/using-symfony-service-decorators-drupal-8.
Michael Chen avatar
флаг nl
Спасибо за информацию, эта статья была действительно полезной, поскольку в ней описаны все детали их рассмотрения и мыслительного процесса.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.