Symfony4 如何在Symfony 4中为滚动条记录器指定Person函数?
在配置Rollbar Monolog配置时,可以设置的选项之一是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-&
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
}
}
]);
}
}