honeybadger-io/honeybadger-laravel

View on GitHub
src/ContextManager.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace Honeybadger\HoneybadgerLaravel;

use Honeybadger\Contracts\Reporter;
use Illuminate\Support\Facades\Route;
use Symfony\Component\HttpFoundation\Request;

class ContextManager
{
    /**
     * @var \Honeybadger\Honeybadger;
     */
    protected $honeybadger;

    /**
     * @param  \Honeybadger\Contracts\Reporter  $honeybadger
     */
    public function __construct(Reporter $honeybadger)
    {
        $this->honeybadger = $honeybadger;
    }

    public function setRouteAction(Request $request)
    {
        if (app('honeybadger.isLumen')) {
            $this->setLumenRouteActionContext($request);
        } else {
            $this->setLaravelRouteActionContext();
        }
    }

    private function setLumenRouteActionContext(Request $request)
    {
        $routes = app()->router->getRoutes();
        $routeIdentifier = $request->method().$request->getPathInfo();

        if (! array_key_exists($routeIdentifier, $routes)) {
            return;
        }

        $routeDetails = $routes[$routeIdentifier]['action'];

        if (! isset($routeDetails['uses']) && ! empty($routeDetails[0])) {
            $this->honeybadger->setComponent(get_class($routeDetails[0]));

            return;
        }

        $routeAction = explode('@', $routeDetails['uses']);

        if (! empty($routeAction[0])) {
            $this->honeybadger->setComponent($routeAction[0] ?? '');
        }

        if (! empty($routeAction[1])) {
            $this->honeybadger->setAction($routeAction[1] ?? '');
        }
    }

    private function setLaravelRouteActionContext()
    {
        if (Route::getCurrentRoute()) {
            $routeAction = explode('@', Route::getCurrentRoute()->getActionName());

            if (! empty($routeAction[0])) {
                $this->honeybadger->setComponent($routeAction[0] ?? '');
            }

            if (! empty($routeAction[1])) {
                $this->honeybadger->setAction($routeAction[1] ?? '');
            }
        }
    }

    public function setUserContext($request)
    {
        try {
            if ($request->user()) {
                $this->honeybadger->context(
                    'user_id',
                    $request->user()->getAuthIdentifier()
                );
            }
        } catch (\InvalidArgumentException $e) {
            // swallow
        }
    }
}