Использование Rollbar с Lumen 5.7 - PullRequest
0 голосов
/ 21 ноября 2018

Итак, в настоящее время наиболее популярными (IMHO) пакетами Rollbar для Lumen (не Laravel) являются:

Учитывая, что https://github.com/jenssegers/laravel-rollbar явно заявляет о попытках добавить поддержку Lumen для 5.x и что есть замечательное руководство Джеймса Эллиота по добавлению Rollbar к Lumen 5.2 , я попыталсяобновите код для своего урока и используйте его для Lumen 5.7.

Основная часть его работы находится в его RollbarLumenServiceProvider, который выглядит следующим образом:

namespace App\Providers;

use Jenssegers\Rollbar\RollbarLogHandler;
use Illuminate\Support\ServiceProvider;
use InvalidArgumentException;
use Monolog\Handler\RollbarHandler;
use Rollbar;
use RollbarNotifier;

class RollbarLumenServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    /**
     * Register the service provider.
     */
    public function register()
    {
        $this->app->configure('rollbar');

        // Don't register rollbar if it is not configured.
        if (! getenv('ROLLBAR_TOKEN') and ! $this->app['config']->get('rollbar')) {
            return;
        }

        $app = $this->app;

        $app[RollbarNotifier::class] = $app->share(function ($app) {

            // Default configuration.
            $defaults = [
                'environment'  => $app->environment(),
                'root'         => base_path(),
            ];

            $config = array_merge($defaults, $app['config']->get('services.rollbar', []));

            $config['access_token'] = getenv('ROLLBAR_TOKEN') ?: $app['config']->get('services.rollbar.access_token');

            if (empty($config['access_token'])) {
                throw new InvalidArgumentException('Rollbar access token not configured');
            }

            Rollbar::$instance = $rollbar = new RollbarNotifier($config);

            return $rollbar;
        });

        $app[RollbarLogHandler::class] = $app->share(function ($app) {
            $level = getenv('ROLLBAR_LEVEL') ?: $app['config']->get('services.rollbar.level', 'debug');

            $handler = app(RollbarHandler::class, [$this->app[RollbarNotifier::class], $level]);

            return $handler;
        });

        // Register the fatal error handler.
        register_shutdown_function(function () use ($app) {
            if (isset($app[Rollbar::class])) {
                $app->make(Rollbar::class);
                Rollbar::report_fatal_error();
            }
        });

        // If the Rollbar client was resolved, then there is a possibility that there
        // are unsent error messages in the internal queue, so let's flush them.
        register_shutdown_function(function () use ($app) {
            if (isset($app[Rollbar::class])) {
                $app[Rollbar::class]->flush();
            }
        });
    }

    public function boot()
    {
        $app = $this->app;

        // Listen to log messages.
        $app['log']->pushHandler(
            app(RollbarLogHandler::class, [
                $this->app[Rollbar::class]
            ])
        );
    }

    public function provides()
    {
        return [
            RollbarLogHandler::class
        ];
    }
}

Моя попытка обновить это для Lumen 5.7 с учётом устаревших и критических изменений выглядит следующим образом:

<?php
namespace App\Providers;

use Jenssegers\Rollbar\RollbarLogHandler;
use Illuminate\Support\ServiceProvider;
use InvalidArgumentException;
use Monolog\Handler\RollbarHandler;
use Rollbar;
use RollbarNotifier;

class RollbarLumenServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    private function getApp($app): \Laravel\Lumen\Application
    {
        return $app;
    }

    /**
     * Register the service provider.
     */
    public function register()
    {
        $app = $this->getApp($this->app);

        $app->configure('rollbar');

        // Don't register rollbar if it is not configured.
        if (!getenv('ROLLBAR_TOKEN') and !$app['config']->get('rollbar')) {
            return;
        }


        $app->singleton(RollbarNotifier::class, function (\Laravel\Lumen\Application $app)
        {
            // Default configuration.
            $defaults = [
                'environment'   =>  $app->environment(),
                'root'          =>  base_path(),
            ];

            $config = array_merge($defaults, $app['config']->get('services.rollbar', []));

            $config['access_token'] = getenv('ROLLBAR_TOKEN') ?: $app['config']->get('services.rollbar.access_token');

            if (empty($config['access_token'])) {
                throw new InvalidArgumentException('Rollbar access token not configured');
            }

            Rollbar::$instance = $rollbar = new RollbarNotifier($config);

            return $rollbar;
        });

        $app->singleton(RollbarHandler::class, function (\Laravel\Lumen\Application $app)
        {
            $level = getenv('ROLLBAR_LEVEL') ?: $app['config']->get('services.rollbar.level', 'debug');

            //$handler = app(RollbarHandler::class, [$app[RollbarNotifier::class], $level]);
            $handler = $app->makeWith(RollbarHandler::class, [$app[RollbarNotifier::class], $level]);

            return $handler;
        });

        // Register the fatal error handler.
        register_shutdown_function(function () use ($app)
        {
            if (isset($app[Rollbar::class]))
            {
                $app->make(Rollbar::class);
                Rollbar::report_fatal_error();
            }
        });

        // If the Rollbar client was resolved, then there is a possibility that there
        // are unsent error messages in the internal queue, so let's flush them.
        register_shutdown_function(function () use ($app)
        {
            if (isset($app[Rollbar::class])) {
                $app[Rollbar::class]->flush();
            }
        });
    }

    public function boot()
    {
        $app = $this->app;

        // Listen to log messages.
        $app['log']->pushHandler(
            $app->makeWith(RollbarLogHandler::class, [$app[Rollbar::class]])
        );
    }

    public function provides()
    {
        return [
            RollbarLogHandler::class
        ];
    }
}

Я думаю, это ПОЧТИ работает.В этом методе я получаю исключение:

    public function boot()
    {
        $app = $this->app;

        // Listen to log messages.
        $app['log']->pushHandler(
            $app->makeWith(RollbarLogHandler::class, [$app[Rollbar::class]])
        );
    }

Вот трассировка исключения:

(1/1) ReflectionException Класс Illuminate \ Foundation \ Application не существует в контейнере.строка php 838

в ReflectionParameter-> getClass () в файле Container.php 838

в контейнере-> resolDependencies (массив (объект (ReflectionParameter), объект (ReflectionParameter), объект(ReflectionParameter))) в строке Container.php 807

в Container-> build ('Jenssegers \ Rollbar \ RollbarLogHandler') в строке Container.php 658

в Container-> resolution ('Jenssegers \ Rollbar \ RollbarLogHandler ', массив (объект (Rollbar))) в строке Container.php 609

в Container-> make (' Jenssegers \ Rollbar \ RollbarLogHandler ', массив (объект (Rollbar))) вСтрока Application.php 260

в Application-> make ('Jenssegers \ Rollbar \ RollbarLogHandler', массив (object (Rollbar))) в строке Container.php 597

в Container-> makeWith('Jenssegers \ Rollbar \ RollbarLogHandler', арраy (object (Rollbar))) в строке RollbarLumenServiceProvider.php 104

в RollbarLumenServiceProvider-> boot () в call_user_func_array (массив (объект (RollbarLumenServiceProvider), 'boot'), array ()) в Boundpethod.строка 29

в BoundMethod :: Illuminate \ Container {closure} () в BoundMethod.php строка 87

в BoundMethod :: callBoundMethod (объект (приложение), массив (объект (RollbarLumenServiceProvider)),'boot'), object (Closure)) в строке BoundMethod.php 31

в BoundMethod :: call (object (Application), массив (object (RollbarLumenServiceProvider), 'boot'), array (), null) в строке Container.php 572

при вызове Container-> (массив (объект (RollbarLumenServiceProvider), 'boot')) в строке Application.php 237

в Application-> bootProvider (объект(RollbarLumenServiceProvider)) в строке Application.php 222

в Application-> Laravel \ Lumen {closure} (объект (RollbarLumenServiceProvider), 'App \ Providers \ RollbarLumenServiceProvider')

Это в этой точкеНе то, чтобы я застрял.Кто-нибудь знает, как исправить эту ошибку?Я не специалист по обслуживанию контейнеров или роллбар и буду признателен за любую помощь.Надеюсь, это послужит хорошим способом заставить Rollbar работать с Lumen 5.7!

1 Ответ

0 голосов
/ 08 декабря 2018

Я сталкивался с этим вопросом, когда столкнулся с той же проблемой.Поскольку ответа не было, я решил попробовать сам.

Я написал статью об этом со своим решением.

http://troccoli.it/rollbar-in-lumen/

Короче, получите rollbar

composer require rollbar/rollbar

Добавить канал rollbar к вашему config/logging.php

<?php

return [
    'default' => env('LOG_CHANNEL', 'stack'),

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['rollbar'],
        ],
        'rollbar' => [
            'driver' => 'monolog',
            'handler' => Rollbar\Monolog\Handler\RollbarHandler::class,
            'access_token' => env('ROLLBAR_ACCESS_TOKEN'),
            'level' => 'debug',
        ],
    ],
];

Написать поставщику услуг RollbarServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Contracts\Config\Repository;
use Illuminate\Support\ServiceProvider;
use Rollbar\RollbarLogger;
use Rollbar\Rollbar;

class RollbarServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(RollbarLogger::class, function () {
            $config = $this->app->make(Repository::class);

            $defaults = [
                'environment' => app()->environment(),
                'root' => base_path(),
                'handle_exception' => true,
                'handle_error' => true,
                'handle_fatal' => true,
            ];

            $rollbarConfig = array_merge($defaults, $config->get('logging.channels.rollbar', []));

            $handleException = (bool)array_pull($rollbarConfig, 'handle_exception');
            $handleError = (bool)array_pull($rollbarConfig, 'handle_error');
            $handleFatal = (bool)array_pull($rollbarConfig, 'handle_fatal');

            Rollbar::init($rollbarConfig, $handleException, $handleError, $handleFatal);

            return Rollbar::logger();
        });
    }
}

Добавить post_server_item- token (you can get this from your rollbar account) into the.env` file

ROLLBAR_ACCESS_TOKEN=ROLLBAR_POST_SERVER_ITEM_TOKEN

и, наконец, связать все это вместе в bootstrap/app.php

$app->register(\App\Providers\RollbarServiceProvider::class);
$app->configure('logging');
...