Risan Bagja

Integrating Raygun with Laravel

You can use Raygun to easily monitor any errors within your Laravel application. Once you’ve signed up for Raygun account and got your Raygun’s API key. Install the official PHP library through composer:

$ composer require mindscape/raygun4php

Now head over to your app/Providers/AppServiceProvider.php file and register the RaygunClient instance.

<?php

namespace App\Providers;

use GuzzleHttp\Client;
use Raygun4php\RaygunClient;
use Raygun4php\Transports\GuzzleAsync;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Register the async transport.
        $this->app->singleton(GuzzleAsync::class, function ($app) {
            $httpClient = new Client([
                'base_uri' => 'https://api.raygun.com',
                'headers' => [
                    'X-ApiKey' => config('services.raygun.api_key'),
                ]
            ]);

            return new GuzzleAsync($httpClient);
        });

        // Register the RaygunClient instance.
        $this->app->singleton(RaygunClient::class, function ($app) {
            return new RaygunClient($app->make(GuzzleAsync::class));
        });
    }

    public function boot()
    {
        // Any requests to Raygun server will be send right before shutdown.
        register_shutdown_function([
            $this->app->make(GuzzleAsync::class), 'wait'
        ]);
    }
}

We register two instances: GuzzleAsync and the RaygunClient itself. We use the GuzzleAsync so any requests to the Raygun server are done asynchronously. This way, when we send an exception data to Raygun, it won’t block the code flow. Because the request will be sent right before the PHP script shutdown. Note, that we also register these two instances as a singleton.

Update your config/services.php file to include a new entry named raygun:

<?php

return [

    // Other settings...

    'raygun' => [
        'api_key' => env('RAYGUN_API_KEY'),
    ],

];

This way, when we need access to our Raygun API key, we can do something like this:

config('services.raygun.api_key');

And we can safely put our Raygun API key within the .env file:

APP_NAME=Laravel

# Other settings...

RAYGUN_API_KEY="YOUR_RAYGUN_API_KEY_HERE"

Finally, we can start sending the exception data to Raygun within the app/Excpetions/Handler.php:

<?php

namespace App\Exceptions;

use Throwable;
use Raygun4php\RaygunClient;
use Illuminate\Support\Facades\App;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    //...

    public function report(Throwable $exception)
    {
        parent::report($exception);

        if ($this->shouldntReport($exception)) {
            return;
        }

        // Only send exception data on non-local environment.
        if (! App::environment('local')) {
            $raygun = resolve(RaygunClient::class);

            $raygun->SendException($exception);
        }
    }

    //...
}

Note that on the example above, we only send an exception data if the environment is not set to local. You can also send additional data like tags or affected user.

$raygun = resolve(RaygunClient::class);

$raygun->SendException($exception, ['your-custom-tag', 'your-other-tag']);

$raygunClient->SetUser(auth()->user()->email);