Получить rootDir внутри функции beforeSend в Symfony для перехвата события Sentry - PullRequest
0 голосов
/ 29 мая 2020

У меня есть служба, которая перехватывает события Sentry. Я использую функцию beforeSend.

Я бы загрузил файл json, содержащий данные, которые нужно очистить или сохранить. Это служба, и я создаю свой конструктор аналогично другим, но контекст «$ this» не существует, когда я нахожусь в отладчике в этой функции.

Ядро находится в глобальных переменных, но я думаю, что это не очень хорошая идея ... Я бы только получил каталог root и все, но я не нашел, как это сделать в этот класс ... Конструктор кажется бесполезным.

Кто-нибудь может мне помочь с подобным опытом?

РЕДАКТИРОВАТЬ:

Сервис:

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'

Но, похоже, конструкции никогда не было.

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Мне не удалось ввести параметр, но я нашел способ получить 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;
}}

Надеюсь ' Помогу кому-то другому.

Спасибо за ответы.

0 голосов
/ 29 мая 2020

Вы можете вставить параметр kernel.project_dir в свой конструктор службы с именованным параметром:

В вашем файле services.yml:

services:
    _defaults:
        bind:
            string $kernelProjectDir: '%kernel.project_dir%'

Затем в вашем сервисе:

public function __construct(string $kernelProjectDir)
{
...