Symfony

Symfony 6,093 (github.com/symfony/symfony (https://github.com/symfony/symfony 31,162 ), MIT) is both a family of decoupled components and a full-stack framework built from them. You already use the components: this chapter's Laravel 2,157 skeleton installs 31 symfony/* packages, including HttpFoundation (Laravel's Request and Response extend its classes), HttpKernel, Routing, Console (under Artisan), Mailer, Process and VarDumper 7,425 (behind dd()).

The framework is at 8.1.7 (15 September 2026) and requires PHP 8.4. Minor versions ship each May and November and majors every two years; the long-term support line, 7.4 (PHP 8.2+), gets bug fixes to November 2028 and security fixes to November 2029. composer create-project symfony/skeleton gives a bare 32-package kernel, and a controller is routed by its attribute:

A Symfony 8.1 controller with an attribute routePHP
<?php
// src/Controller/HelloController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\Attribute\Route;
final class HelloController extends AbstractController
{
    #[Route('/hello', methods: ['GET'])]
    public function __invoke(): Response
    {
        return new Response('Hello, bookshop, from Symfony ' . Kernel::VERSION . "\n",
            headers: ['Content-Type' => 'text/plain']);
    }
}

Everything else arrives by composer require, with Symfony Flex writing its configuration into config/. The usual database layer is the Doctrine ORM 159,716 , a data mapper whose entities are plain objects saved by an EntityManager, unlike Eloquent's active record (Eloquent Models). Choose Symfony for large systems meant to last a decade, where explicit wiring and long LTS windows matter more than speed of writing.