Сервисный вызов обработчика пользовательских журналов Symfony - PullRequest
0 голосов
/ 06 октября 2018

Я создал собственный обработчик журнала в Symfony.Создание это не было проблемой, config: config / packages / dev / monolog.yaml

monolog:
    handlers:
     ....
        alerts:
            type: service
            id: App\Logger\AlertLogger
            channels: [app]
            level:  warning

И мой сервис:

<?php

namespace App\Logger;
use Monolog\Handler\AbstractProcessingHandler;
class AlertLogger extends AbstractProcessingHandler
{
    protected function write(array $record)
    {
        // handle log
    }
}

Но проблема в том, что я хочу отправить эторегистрируется в RabbitMQ и что-то делает в Consumer, но нет никакой возможности вызвать любую другую службу.Я пытался передать его для создания, но я получаю ошибки, такие как:

Аргумент 3 передан в App \ Logger \ AlertLogger :: __ construct () должен реализовать интерфейс OldSound \ RabbitMqBundle \ RabbitMq \ ProducerInterface, stringданный, вызванный в .....

Это потому, что в AbstractProcessingHandler есть определение конструкции.

=============== РЕДАКТИРОВАТЬ: Мои тесты:

Конструктор родительского класса:

public function __construct($level = Logger::DEBUG, $bubble = true)
{
    $this->setLevel($level);
    $this->bubble = $bubble;
}

Я пытался добавить журналобработчик как сервис для services.yaml:

services:
    .....
    App\Logger\AlertLogger:
        arguments:
            $producer: OldSound\RabbitMqBundle\RabbitMq\Producer

И мой обработчик журнала:

...
class AlertLogger extends AbstractProcessingHandler
{
    /**
     * @var ProducerInterface
     */
    private $producer;
    public function __construct(ProducerInterface $producer)
    {
        $this->producer = $producer;
    }
  ......

Но я получаю эту ошибку:

Аргумент 1 пройденв App \ Logger \ AlertLogger :: __ construct () должен реализовывать интерфейс OldSound \ RabbitMqBundle \ RabbitMq \ ProducerInterface, заданная строка вызывается в

Когда я пытаюсь установить аргументы конструкции:

....
class AlertLogger extends AbstractProcessingHandler
{
    /**
     * @var ProducerInterface
     */
    private $producer;
    public function __construct($level, $bubble, ProducerInterface $producer)
    {
        parent::__construct($level, $bubble);
        $this->producer = $producer;
    }
.....

Я получил ошибку:

Невозможно автоматически подключить службу "App \ Logger \ AlertLogger": аргумент "$ level" метода "__construct ()" не имеет подсказки типа, вам нужно настроить его значениеявно.

1 Ответ

0 голосов
/ 07 октября 2018

Лукас, чтобы переопределить аргументы вашего конструктора, вы должны определить для него собственный конструктор и настроить определение сервиса для (если он не подключен автоматически).К сожалению, это приводит к потере предопределенной функциональности (т. Е. Настройка level здесь бесполезна), поэтому вам придется переопределить ее самостоятельно.

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

https://github.com/symfony/monolog-bundle/blob/master/DependencyInjection/MonologExtension.php#L131-L135

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

Редактировать:

должно быть

services:
    .....
    App\Logger\AlertLogger:
        arguments:
            $level: 'warning'
            $bubble: true
            $producer: "@OldSound\RabbitMqBundle\RabbitMq\Producer"

С конструктором

/**
 * @var ProducerInterface
 */
private $producer;
public function __construct($level, $bubble, ProducerInterface $producer)
{
    parent::__construct($level, $bubble);
    $this->producer = $producer;
}
...