Итак, в настоящее время наиболее популярными (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!