Как указать функцию человека для регистратора Rollbar в Symfony 4?

При настройке конфигурации Rollbar Monolog одним из параметров, которые можно установить, является функция person_fn. Ожидается, что эта конфигурация Rollbar будет своего рода «вызываемой», которая при вызове будет возвращать информацию о пользователе.

Чтобы получить информацию о текущем пользователе, этому методу потребуется обработчик сеанса, чтобы получить пользователя, вошедшего в систему в данный момент. Я могу написать сервис, который делает это:

<?php
class UserService {
  private $session;

  public function __construct(SessionInterface $session) {
    $this->session = $session;
  }

  public function RollbarUserFn() {
    $u = $this->session->get('current_user');
    return array(
      'id' => $u['id'],
      'username' => $u['username']
    ); 
  }
}

Теперь, если просто использовать call_user_func, метод RollbarUserFn не является статическим (поскольку у него есть зависимость), поэтому нельзя использовать "UserService::RollbarUserFn" (строку), а скорее создать его экземпляр и передать объект в:

$us = new UserService($sessionInterface);
call_user_func(array($us, 'RollbarUserFn'));

Но как я могу сделать это эквивалентно в файле конфигурации YAML? Я пробовал что-то вроде:

monolog:
  handlers:
    rollbar:
      type: rollbar
      token: '123123123'
      config:
        environment: '%env(APP_ENV)%'
        person_fn: [ '@UserService', 'RollbarUserFn' ]

Но это выдает ошибку, что узел конфигурации person_fn должен быть скаляром, а не массивом.


person MidnightLightning    schedule 18.06.2018    source источник
comment
Здравствуйте! Лучший способ получить ответ на свой вопрос — отправить электронное письмо по адресу [email protected]. Это позволит вам напрямую связаться с разработчиками, которые поддерживают Rollbar SDK.   -  person Jesse Gibbs    schedule 19.06.2018
comment
Спасибо, @JesseGibbs, но проблема здесь не в Rollbar и его SDK, а скорее в Symfony и его средствах описания сервисов, которые кажутся камнем преткновения.   -  person MidnightLightning    schedule 19.06.2018


Ответы (1)


Вы можете украсить RollbarHandlerFactory из rollbar/rollbar-php-symfony-bundle вот так:

#config/services_prod.yaml

services:
  App\Service\RollbarHandlerFactory:
    decorates: Rollbar\Symfony\RollbarBundle\Factories\RollbarHandlerFactory
    arguments:
      - '@service_container'
      - ['password', 'plainPassword', 'proxyInitialized', 'proxyInitializer', 'photo']

и перенастроить регистратор

<?php

namespace App\Service;

use Rollbar\Rollbar;
use Rollbar\Symfony\RollbarBundle\Factories\RollbarHandlerFactory as BaseFactory;
use Symfony\Component\DependencyInjection\ContainerInterface;

class RollbarHandlerFactory extends BaseFactory
{
    public function __construct(ContainerInterface $container, array $scrubFields = [])
    {
        parent::__construct($container);

        Rollbar::logger()->configure([
            'person_fn' => function () use ($container, $scrubFields) {
                try {
                    $token = $container->get('security.token_storage')->getToken();

                    if ($token) {
                        /** @var \App\Model\User $user */
                        $user = $token->getUser();
                        $serializer = $container->get('serializer');
                        $person = \json_decode($serializer->serialize($user, 'json'), true);

                        foreach ($scrubFields as $field) {
                            unset($person[$field]);
                        }

                        $person['id'] = $user->getEmail();

                        return $person;
                    }
                } catch (\Exception $exception) {
                    // Ignore
                }
            }
        ]);
    }
}

person Aleksandr    schedule 05.06.2019