class ReservationService {

  public function calculateTotal()
  {
      return $this->pricingService
          ->applySeasonModifier()
          ->applyDiscountRules()
          ->applyChannelCommission()
          ->applyTaxes()
          ->buildInvoice();
  }

}

// Domain rules evolve
// architecture decisions matter
// complexity grows over time

Back to projects

Architecture Experiment

PHP API Benchmark

Experimental project comparing how different PHP frameworks behave when implementing the same small REST API.

3 Implementations

Plain PHP, Laravel and Symfony implementations.

Single Domain

The same entity and rules implemented in all frameworks.

Architecture Focus

Comparing complexity, DX and evolution capacity.

This project explores how different architectural approaches affect the development and evolution of a small backend API.

The goal is not to determine which framework is "better", but to analyze how each approach handles complexity, structure and developer experience when solving the same problem.

🧩 Domain Model

The benchmark is built around a very small domain: a habit tracking API. The system allows users to define personal habits and track their completion progress over time.

  • Create habits
  • List existing habits
  • Update habit configuration
  • Register habit completion

🗂️ Entity: Habit

Each habit represents a recurring activity the user wants to track.

id name description frequency (daily / weekly) target_count completed_count created_at

⚙️ Framework Implementations

  • PHP — Minimal implementation without a framework, focusing on explicit routing and manual dependency management.
  • Laravel — Implementation using Eloquent models, controllers and Laravel's typical service architecture.
  • Symfony — Implementation using Symfony controllers, dependency injection and Doctrine ORM.

📊 Evaluation Criteria

Each implementation will be evaluated across several dimensions:

  • Structural complexity
  • Developer experience during implementation
  • Ease of adding new features
  • Testability of the system

🎯 Project Goal

The purpose of this experiment is to better understand the trade-offs between simplicity and abstraction in backend development.

By implementing the same API with different architectural approaches, it becomes easier to evaluate how frameworks influence the evolution of a codebase as complexity grows.