georgeff/problem

Translate exceptions to structured domain problems with a fluent builder and logger.

Maintainers

Package info

github.com/MikeGeorgeff/problem

pkg:composer/georgeff/problem

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-02-22 02:09 UTC

This package is auto-updated.

Last update: 2026-03-22 02:18:51 UTC


README

Structured domain exceptions for PHP with a fluent builder API, exception translation, severity levels, context, correlation tracking, and serialization.

Installation

composer require georgeff/problem

Overview

This package provides a set of domain-scoped exception classes that extend PHP's \Exception with structured fields for logging, translation, and observability:

  • Severity — one of critical, error, warning, info, debug
  • Context — arbitrary key-value data describing the failure scenario
  • Retryability — signals whether the triggering operation can be retried
  • Correlation ID — request-scoped trace identifier, null when not provided
  • Structured data — a fully serializable snapshot for loggers and reporters

Each exception type comes with a fluent builder that handles message generation, code assignment, and context population for common failure scenarios. A translator converts arbitrary PHP exceptions into typed domain exceptions via a priority-ordered handler pipeline. A reporter composes translation and structured logging into a single drop-in component for application exception handlers.

Documentation

Core

Translation

  • TranslationExceptionTranslator, handler pattern, PDOCatchAllHandler, and SQLSTATE routing

Logging

  • LoggingJsonStructuredLogger, EnvironmentEnricher, ContextEnricher, and combining with translation

Reporting

  • ReportingExceptionReporter, correlation ID threading, application handler integration

Exceptions & Builders

Exception Severity Retryable Error Code Docs
DatabaseException error false DB_NNNN database.md
ValidationException warning false VAL_NNNN validation.md
ExternalServiceException error true EXT_NNNN external-service.md
AuthenticationException warning true AUTHN_NNNN authentication.md
AuthorizationException warning false AUTHZ_NNNN authorization.md
NotFoundException info false NOT_FOUND_NNNN not-found.md
ConfigurationException critical false CFG_NNNN configuration.md
UnknownException error false UNKNOWN_0000 unknown.md

Quick Example

use Georgeff\Problem\DatabaseExceptionBuilder;
use Georgeff\Problem\ValidationExceptionBuilder;
use Georgeff\Problem\Exception\DomainException;

// Database failure
DatabaseExceptionBuilder::new()
    ->connectionFailed()
    ->connection('db.example.com', 5432, 'myapp')
    ->throw();

// Validation failure
$builder = ValidationExceptionBuilder::new()
    ->required('email')
    ->minLength('username', 'ab', 3);

if ($builder->hasErrors()) {
    $builder->throw();
}

// Inspect any domain exception
} catch (DomainException $e) {
    $e->severity;        // "error"
    $e->retryable;       // false
    $e->context;         // ['query' => [...], ...]
    $e->correlationId;   // "a3f9..."
    $e->structuredData;  // full serializable snapshot
    $e->getErrorCode();  // "DB_0001"
}

License

MIT — see LICENSE.