Symfony - вход в несколько файлов журнала в службе - PullRequest
0 голосов
/ 29 ноября 2018

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

Мой service.yaml:

App\Services\PrinterManager:
    arguments: ['@doctrine.orm.entity_manager','@logger', '', '', '', '','']
    tags:
        - { name: monolog.logger, channel: printerface}

App\Services\Printer\Printer:
    autowire: true
    autoconfigure: false
    public: false
    parent: App\Services\PrinterManager
    arguments:
        index_2: '@logger'
        index_3: '@oneup_flysystem.printer_invoice_filesystem'
        index_4: '@oneup_flysystem.printerface_content_filesystem'
        index_5: '@oneup_flysystem.sftp_filesystem'
        index_6: '@App\Services\PrinterApiService'
    tags:
        - { name: monolog.logger, channel: printerlog}

Мой monolog.yaml:

monolog:
  handlers:
    main:
        type: stream
        path: "%kernel.logs_dir%/%kernel.environment%.log"
        level: debug
        channels: ["!event, !printerface", "!printerlog"]
    printerface:
        type: stream
        level: debug
        channels: ["printerface"]
        path: "%kernel.logs_dir%/printerface.log"
    printerlog:
        type: stream
        level: debug
        channels: ["printerlog"]
        path: "%kernel.logs_dir%/printerlog.log"

Но похоже, что текущая конфигурация службы нарушает конструктор, и я получаю следующееошибка:

The argument must be an existing index or the name of a constructor's parameter.          

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

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я не делал этого с родительским / дочерним классом, но с чем-то более простым, я использую именованные параметры, вот что у меня есть (с тремя разными регистраторами):

# App/Subscribers/WebhookLoggingListener.php file
public function __construct(
    LoggerInterface $logger, 
    LoggerInterface $mailgunLog, 
    LoggerInterface $dripLog) {
}

# services.yml
App\Subscribers\WebhookLoggingListener:
    arguments:
        $logger: "@logger"
        $mailgunLog: "@monolog.logger.mailgun"
        $dripLog: "@monolog.logger.drip"
    tags:
       - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

Если бы я использовал другие регистраторы в другом месте, я мог бы также связать их с определенными именами переменных:

services:
    _defaults:
        # ... other config
        bind:
            $dripLog: "@?monolog.logger.drip"
0 голосов
/ 29 ноября 2018

Это метод, который Symfony использует для замены аргументов родителя в дочернем сервисе:

/**
 * You should always use this method when overwriting existing arguments
 * of the parent definition.
 *
 * If you directly call setArguments() keep in mind that you must follow
 * certain conventions when you want to overwrite the arguments of the
 * parent definition, otherwise your arguments will only be appended.
 *
 * @param int|string $index
 * @param mixed      $value
 *
 * @return self the current instance
 *
 * @throws InvalidArgumentException when $index isn't an integer
 */
public function replaceArgument($index, $value)
{
    if (\is_int($index)) {
        $this->arguments['index_'.$index] = $value;
    } elseif (0 === strpos($index, '$')) {
        $this->arguments[$index] = $value;
    } else {
        throw new InvalidArgumentException('The argument must be an existing index or the name of a constructor\'s parameter.');
    }
    return $this;
}

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

Поэтому я думаю, что вы должны определить свою дочернюю службу следующим образом:

App\Services\Printer\Printer:
    autowire: true
    autoconfigure: false
    public: false
    parent: App\Services\PrinterManager
    arguments:
        2: '@logger'
        3: '@oneup_flysystem.printer_invoice_filesystem'
        4: '@oneup_flysystem.printerface_content_filesystem'
        5: '@oneup_flysystem.sftp_filesystem'
        6: '@App\Services\PrinterApiService'
    tags:
        - { name: monolog.logger, channel: printerlog}

Обновление:

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

App\Services\Printer\Printer:
    autowire: true
    autoconfigure: false
    public: false
    parent: App\Services\PrinterManager
    arguments:
        $arg2: '@logger'
        $arg3: '@oneup_flysystem.printer_invoice_filesystem'
        $arg4: '@oneup_flysystem.printerface_content_filesystem'
        $arg5: '@oneup_flysystem.sftp_filesystem'
        $arg6: '@App\Services\PrinterApiService'
    tags:
        - { name: monolog.logger, channel: printerlog}

$arg2, $arg3, $arg4, $arg5 и $arg6 должны быть заменены аргументом конструктора вашего классаимена.

...