在 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;
}}

希望对其他人有所帮助。

感谢您的回答。