Symfony4 如何在Symfony 4中为滚动条记录器指定Person函数?

Symfony4 如何在Symfony 4中为滚动条记录器指定Person函数?,symfony4,monolog,rollbar,Symfony4,Monolog,Rollbar,在配置Rollbar Monolog配置时,可以设置的选项之一是person\u fn功能。该配置Rollbar期望是某种“可调用的”,调用时将返回有关用户的信息 为了获取关于当前用户的信息,该方法需要会话处理程序来获取当前登录的用户。我可以编写这样的服务: <?php class UserService { private $session; public function __construct(SessionInterface $session) { $this-&

在配置Rollbar Monolog配置时,可以设置的选项之一是
person\u 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']
    ); 
  }
}
但是我如何在config YAML文件中实现这一等效功能呢?我试过这样的方法:

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

但这会引发一个错误,即
person\u fn
config节点应该是标量,而不是数组您可以从
rollbar/rollbar php symfony bundle
中装饰
rollbar handlerfactory
,如下所示:

#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
                }
            }
        ]);
    }
}


你好-获得问题答案的最佳方式是发送电子邮件support@rollbar.com.  这将使您直接与维护Rollbar SDK的开发人员联系。谢谢,@JesseGibbs,但这里的问题不是Rollbar及其SDK,而是Symfony及其描述“服务”的方式,这似乎是症结所在。
<?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
                }
            }
        ]);
    }
}