在 Symfony 的 beforeSend 函数中获取 rootDir 以拦截 Sentry 事件
Get rootDir inside beforeSend function in Symfony to intercept Sentry event
我有一个拦截哨兵事件的服务。我正在使用一个名为 beforeSend 的函数。
我会加载一个 json 文件,其中包含要擦除或保留的数据。这是一项服务,我使用与其他人类似的方式构建我的构造函数,但是当我在此函数的调试器中时,“$this”上下文不存在。
内核在全局变量中,但我认为这不是一个好主意...我只想获取根目录,仅此而已,但我找不到如何在其中执行此操作 class... 构造函数似乎没用。
有人可以帮助我有类似的经历吗?
编辑:
服务:
namespace App\Services;
use Sentry\Event;
use Symfony\Component\HttpKernel\KernelInterface;
class SentryBeforeSendService
{
private static $rootDir;
public function __construct(KernelInterface $kernel)
{
self::$rootDir = $kernel->getRootDir();
}
/**
* Scrubs the value of all TARGET_PARAMETERS
* in the event's request.
*
* @param Event $event
*
* @return Event
*/
public function beforeSend(Event $event)
{
$rootDir = self::$rootDir;
$event->setRequest(self::scrubRequest($event->getRequest(), $rootDir));
try {
$composerData = json_decode(file_get_contents($rootDir.'/../composer.json'), true);
$version = $composerData['version'];
$event->setRelease($version);
} catch (\Exception $e) {
//do nothing
}
return $event;
}
/**
* Scrubs GET and POST parameters
*
* @param array $request
*
* @return array
*/
private static function scrubRequest(array $request, $rootDir)
{
// DO SOMETHING WITH $rootDir to scrub data with external file
}}
services.yml :
app.service.sentry_before_send:
class: 'App\Services\SentryBeforeSendService'
arguments: ['@kernel']
config_prod.yml :
sentry:
dsn: "%sentry_dsn%"
options:
environment: "%sentry_environment%"
# release: '%env(VERSION)%' #overridden from composer.json version in SentryBeforeSendService::beforeSend
before_send: 'App\Services\SentryBeforeSendService::beforeSend'
但似乎构造从未发生过。
非常感谢。
您可以使用命名参数在服务构造函数中注入 kernel.project_dir
参数:
在您的 services.yml 文件中:
services:
_defaults:
bind:
string $kernelProjectDir: '%kernel.project_dir%'
那么在您的服务中:
public function __construct(string $kernelProjectDir)
{
我无法注入参数,但我找到了一种从我的方法中获取 project_root 的方法。半胜...
config_prod.yml:
sentry:
dsn: "%sentry_dsn%"
options:
environment: "%sentry_environment%"
# release: '%env(VERSION)%' #overridden from composer.json version in SentryBeforeSendService::beforeSend
before_send: 'App\Services\SentryBeforeSendService::beforeSend'
project_root: '%kernel.project_dir%'
服务:
<?php
namespace App\Services;
use Sentry\Event;
use Sentry\State\Hub;
class SentryBeforeSendService
{
private static $projectRoot;
/**
* Scrubs the value of all TARGET_PARAMETERS
* in the event's request.
*
* @param Event $event
*
* @return Event
*/
public function beforeSend(Event $event)
{
$sentryClient = Hub::getCurrent()->getClient();
self::$projectRoot = $sentryClient->getOptions()->getProjectRoot();
$event->setRequest(self::scrubRequest($event->getRequest()));
try {
$composerData = json_decode(file_get_contents(self::$projectRoot.'/composer.json'), true);
$version = $composerData['version'];
$event->setRelease($version);
} catch (\Exception $e) {
//do nothing
}
return $event;
}}
希望对其他人有所帮助。
感谢您的回答。
我有一个拦截哨兵事件的服务。我正在使用一个名为 beforeSend 的函数。
我会加载一个 json 文件,其中包含要擦除或保留的数据。这是一项服务,我使用与其他人类似的方式构建我的构造函数,但是当我在此函数的调试器中时,“$this”上下文不存在。
内核在全局变量中,但我认为这不是一个好主意...我只想获取根目录,仅此而已,但我找不到如何在其中执行此操作 class... 构造函数似乎没用。
有人可以帮助我有类似的经历吗?
编辑:
服务:
namespace App\Services;
use Sentry\Event;
use Symfony\Component\HttpKernel\KernelInterface;
class SentryBeforeSendService
{
private static $rootDir;
public function __construct(KernelInterface $kernel)
{
self::$rootDir = $kernel->getRootDir();
}
/**
* Scrubs the value of all TARGET_PARAMETERS
* in the event's request.
*
* @param Event $event
*
* @return Event
*/
public function beforeSend(Event $event)
{
$rootDir = self::$rootDir;
$event->setRequest(self::scrubRequest($event->getRequest(), $rootDir));
try {
$composerData = json_decode(file_get_contents($rootDir.'/../composer.json'), true);
$version = $composerData['version'];
$event->setRelease($version);
} catch (\Exception $e) {
//do nothing
}
return $event;
}
/**
* Scrubs GET and POST parameters
*
* @param array $request
*
* @return array
*/
private static function scrubRequest(array $request, $rootDir)
{
// DO SOMETHING WITH $rootDir to scrub data with external file
}}
services.yml :
app.service.sentry_before_send:
class: 'App\Services\SentryBeforeSendService'
arguments: ['@kernel']
config_prod.yml :
sentry:
dsn: "%sentry_dsn%"
options:
environment: "%sentry_environment%"
# release: '%env(VERSION)%' #overridden from composer.json version in SentryBeforeSendService::beforeSend
before_send: 'App\Services\SentryBeforeSendService::beforeSend'
但似乎构造从未发生过。
非常感谢。
您可以使用命名参数在服务构造函数中注入 kernel.project_dir
参数:
在您的 services.yml 文件中:
services:
_defaults:
bind:
string $kernelProjectDir: '%kernel.project_dir%'
那么在您的服务中:
public function __construct(string $kernelProjectDir)
{
我无法注入参数,但我找到了一种从我的方法中获取 project_root 的方法。半胜...
config_prod.yml:
sentry:
dsn: "%sentry_dsn%"
options:
environment: "%sentry_environment%"
# release: '%env(VERSION)%' #overridden from composer.json version in SentryBeforeSendService::beforeSend
before_send: 'App\Services\SentryBeforeSendService::beforeSend'
project_root: '%kernel.project_dir%'
服务:
<?php
namespace App\Services;
use Sentry\Event;
use Sentry\State\Hub;
class SentryBeforeSendService
{
private static $projectRoot;
/**
* Scrubs the value of all TARGET_PARAMETERS
* in the event's request.
*
* @param Event $event
*
* @return Event
*/
public function beforeSend(Event $event)
{
$sentryClient = Hub::getCurrent()->getClient();
self::$projectRoot = $sentryClient->getOptions()->getProjectRoot();
$event->setRequest(self::scrubRequest($event->getRequest()));
try {
$composerData = json_decode(file_get_contents(self::$projectRoot.'/composer.json'), true);
$version = $composerData['version'];
$event->setRelease($version);
} catch (\Exception $e) {
//do nothing
}
return $event;
}}
希望对其他人有所帮助。
感谢您的回答。