Symfony 8.2 neue Features erklärt

Von Roland Golla
0 Kommentar
Gemälde im Dalí Stil: Tor mit Schriftzug Symfony 8.2, Elefant bringt Kisten

Symfony 8.2 ist eine Minor Version mit erstaunlich viel Inhalt. Login über OpenID Connect ohne Zusatzpaket, ein Sudo Mode für sensible Aktionen, verschlüsselte Datenbankspalten mit einem Attribut und eine Messenger Queue, die keine Nachricht mehr doppelt verarbeitet. Dazu kommen Formulare direkt am DTO, Console Befehle mit Leerzeichen und eine neue Komponente, die Tools für KI Agenten beschreibt. Wir betreiben Symfony täglich in Production, auch diese Website läuft auf dem Symfony CMS Sulu. Hier erklären wir die wichtigsten Features und was sie im Projektalltag bringen. Den Gesamtüberblick über Architektur und Versionen findet ihr in unserem Glossar zum Symfony Framework.

Symfony Update geplant?

Wir bringen eure Anwendung mit eurem Team auf Symfony 8.2. Deprecations lösen wir mit Rector, abgesichert durch PHPStan, PHPUnit und Cypress E2E Tests in der Pipeline.

Symfony 8.2 neue Features im Überblick

FeatureKomponenteWas ihr davon habt
OpenID Connect LoginSecurityLogin mit Keycloak, Auth0, Okta oder Entra ID ohne Fremdbundle
Sudo ModeSecurityErneute Anmeldung vor sensiblen Aktionen
KeyManagement und #[Encrypted]KeyManagement, Doctrine BridgeDatenbankspalten mit einem Attribut verschlüsseln
Outbox, Inbox und Claim CheckMessengerKeine verlorenen oder doppelt verarbeiteten Nachrichten
#[Lock] AttributHttpKernel, LockKritische Controller laufen nie doppelt gleichzeitig
Attribute FormsFormFormulare direkt am DTO definieren
Console Sub CommandsConsoleBefehle mit Leerzeichen wie bei Git
JsonSchema KomponenteJsonSchemaSchemas für OpenAPI, MCP Server und KI Agent Tools
Ein Bundle pro KomponentealleSchlankere Config ohne framework Ebene
PerformanceSerializer, Cache, ProfilerSchnellere APIs und Builds ohne Codeänderung

Wann erscheint Symfony 8.2 und welche PHP Version braucht es

Symfony 8.2 erscheint im November 2026 und setzt PHP 8.4 voraus. Wie jede Minor Version außerhalb von LTS bekommt sie acht Monate Support, das Ende ist für Juli 2027 geplant. Den aktuellen Stand zeigt die offizielle Release Seite zu Symfony 8.2. Wer heute noch auf Symfony 8.0 sitzt, läuft bereits ohne Sicherheitsupdates. Für langlebige Projekte bleibt Symfony 7.4 LTS die ruhige Alternative.

Prüft vor dem Update die PHP Version auf allen Ebenen: lokal, im Docker Image und im CI Runner. Wie schnell eine PHP Lücke gefährlich wird, hat zuletzt PHP2Shell gezeigt.

OpenID Connect Login in Symfony ohne Zusatz Bundle

OpenID Connect steckt hinter fast jedem Button „Mit … anmelden“. Bisher brauchte ein Browser Login in Symfony dafür ein Drittpaket. Symfony 8.2 bringt den neuen Authenticator oidc_login, der den kompletten Authorization Code Flow selbst abwickelt. Ihr installiert HttpClient und die JWT Bibliothek, dann reicht diese Konfiguration:

# config/packages/security.yaml
security:
    providers:
        oidc_users:
            oidc: ~

    firewalls:
        main:
            provider: oidc_users
            oidc_login:
                provider_uri: '%env(OIDC_PROVIDER_URI)%'
                client_id: '%env(OIDC_CLIENT_ID)%'
                client_authentication:
                    client_secret_basic: '%env(OIDC_CLIENT_SECRET)%'
                scope: ['openid', 'profile', 'email']

Die Endpoints des Providers liest Symfony aus dessen Discovery Dokument. Wichtiger ist, was ihr nicht mehr selbst bauen müsst: State und Nonce Prüfung, PKCE, Signaturprüfung gegen die Schlüssel des Providers inklusive Key Rotation und die Validierung der Claims. Refresh Tokens und Logout beim Provider lassen sich per Option einschalten. Damit passt Symfony direkt zu Keycloak oder Authentik, die ihr selbst auf Servern in Deutschland betreiben könnt. Alle Optionen beschreibt der Symfony Artikel zum OpenID Connect Login.

Sudo Mode in Symfony für sensible Aktionen

IS_AUTHENTICATED_FULLY sagt, wie sich jemand angemeldet hat. Es sagt nicht, wann. Wer sich morgens einloggt und den Laptop offen lässt, ist abends immer noch voll angemeldet. Symfony 8.2 bringt deshalb zwei neue Attribute:

  • IS_AUTHENTICATED_RECENTLY: Anmeldung in den letzten zwei Stunden
  • IS_AUTHENTICATED_VERY_RECENTLY: Anmeldung in den letzten fünf Minuten
#[IsGranted('IS_AUTHENTICATED_RECENTLY')]
public function changeEmail(): Response
{
    // ...
}

#[IsGranted('IS_AUTHENTICATED_VERY_RECENTLY')]
public function deleteAccount(): Response
{
    // ...
}

Mit form_login funktioniert der Ablauf direkt. Symfony schickt die Person zum Login, der Benutzername ist schon ausgefüllt, danach geht es zurück zur Seite. Ein Remember Me Cookie reicht für diese Prüfungen bewusst nicht. Die Zeiten stellt ihr in der security.yaml ein. Wer mehr braucht, etwa einen Hardware Key für Zahlungen, erweitert den Trust Resolver. Für Tests heißt das: Login Flows gehören jetzt in jeden E2E Durchlauf. Unser Cypress E2E Testing Setup deckt genau solche Abläufe ab.

Doctrine Spalten verschlüsseln mit Symfony KeyManagement

Die neue KeyManagement Komponente gibt euch eine einzige API für Schlüssel aus AWS KMS, Azure Key Vault, Google Cloud KMS oder HashiCorp Vault. Für Entwicklung und Tests gibt es lokale Backends auf Basis von libsodium und OpenSSL. Die Komponente arbeitet mit Envelope Encryption, die Daten werden also mit einem eigenen Schlüssel verschlüsselt, der selbst wieder vom KMS geschützt wird.

Richtig praktisch wird das mit Doctrine. Ein Attribut #[Encrypted] an einer Entity Eigenschaft reicht, und Symfony legt beim Kompilieren des Containers den passenden Doctrine Typ an. Mit #[BlindIndexed] bleiben solche Spalten sogar durchsuchbar. Für Teams mit DSGVO Pflichten ist das ein großer Schritt. Wichtig bleibt trotzdem: Echte Kundendaten gehören nicht in Entwicklungsumgebungen. Wie das mit Seed Daten klappt, zeigt Staging ohne Produktionsdaten.

Symfony Messenger mit Outbox, Inbox und Claim Check

Messenger bekommt in Symfony 8.2 drei Muster, die man bisher selbst bauen musste.

  • Outbox: Nachrichten landen in derselben Datenbank Transaktion wie eure Änderungen. Ein Relay Worker schickt sie danach an den echten Broker. Kein Rollback verschickt mehr eine Nachricht.
  • Inbox: Stürzt ein Worker nach dem Commit, aber vor dem Acknowledge ab, liefert der Broker die Nachricht erneut. Die Inbox erkennt das und überspringt die Handler. Keine doppelte Abbuchung, keine doppelte Mail.
  • Claim Check: Große Nachrichten über dem Limit des Brokers landen in einem Cache Pool, über die Queue läuft nur eine kleine Referenz.
# config/packages/messenger.yaml
framework:
    messenger:
        identity_stamps: true

        transports:
            orders:
                dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
                inbox: true

        buses:
            messenger.bus.default:
                middleware: [doctrine_transaction]

Die Inbox braucht die Doctrine Messenger Bridge und läuft auf derselben Datenbankverbindung wie eure Handler. Dazu kommen signierte Transports mit Secret Rotation, parallele Worker, schnelleres AMQP und ein MongoDB Transport. Achtung beim Update: Das Signieren per Handler Option ist jetzt deprecated und wandert an den Transport. Details stehen im Symfony Artikel zur Messenger Inbox.

Doppelte Requests verhindern mit dem Lock Attribut

Ein Katalog Import, eine Bestellung oder die letzten Tickets einer Konferenz dürfen nie zweimal gleichzeitig laufen. Bisher hieß das: Lock Factory injizieren, Key bauen, Lock holen, Fehlerfall behandeln, Lock freigeben. In Symfony 8.2 reicht ein Attribut:

#[Route('/conference/{conference}/tickets', methods: 'POST')]
#[Lock('ticket-sale-{conference}', blocking: true, ttl: 10)]
public function buyTicket(Conference $conference): Response
{
    // ...
}

Ohne blocking bekommt ein konkurrierender Request ein 409 Conflict. Mit read: true gibt es geteilte Locks, mehrere Downloads laufen also parallel, ein Import wartet. Der Standard TTL liegt bei 30 Sekunden und wird nicht automatisch verlängert. Bei langen Jobs injiziert ihr das Lock in den Controller und verlängert es selbst. Platzhalter wie {conference} funktionieren jetzt auch im #[RateLimit] Attribut.

Symfony Formulare per Attribut am DTO

Viele Anwendungen haben Dutzende kleine Form Klassen, die nur Felder auflisten. Symfony 8.2 erlaubt es, solche Formulare direkt an der Datenklasse zu definieren:

#[AsFormType]
class UserDto
{
    #[FormField]
    public ?string $name = null;

    #[FormField(EmailType::class)]
    public ?string $email = null;
}

// im Controller
$form = $this->createForm(UserDto::class, $userDto);

Alles wird beim Kompilieren des Containers aufgelöst, ein doppelter Feldname fällt also schon im Build auf. Form Klassen bleiben der richtige Weg, sobald ein Formular Logik braucht. Event Listener und Data Transformer hängt ihr über eine Type Extension an. Nach dem gleichen Prinzip lassen sich jetzt auch Workflows und State Machines per Attribut auf einer normalen Klasse definieren.

Symfony Console Sub Commands wie bei Git

Docker und Git trennen Ebenen mit Leerzeichen, jede Ebene hat eigene Optionen. Genau das kann die Symfony Console jetzt auch. Bestehende Namespaces funktionieren sofort:

php bin/console cache clear
php bin/console cache:clear

php bin/console tenant --name=acme users import customers.csv --dry-run

Ein Sub Command liest die Optionen seiner Eltern über das neue Objekt CommandChain. Ganze Befehlsbäume passen per #[AsCommand] in eine einzige Klasse. Achtet auf eine Änderung: Sub Commands haben Vorrang. Hat ein Befehl ein Argument, dessen Wert wie ein Sub Command heißt, braucht ihr künftig -- davor. Prüft eure Skripte in der Pipeline, bevor ein Deployment überrascht. Wie wir Pipelines mit Quality Gates aufsetzen, zeigt das NCA CI/CD Pipeline Setup.

JsonSchema Komponente für OpenAPI und KI Agenten

KI Agenten und MCP Server müssen wissen, welche Argumente ein Tool erwartet. OpenAPI braucht dieselbe Beschreibung für Requests und Responses. Die neue JsonSchema Komponente erzeugt beides aus euren PHP Typen. Der Kern stammt aus dem json-schema Paket von API Platform. Das Schema folgt dabei euren Serializer Gruppen und Validator Constraints. Aus #[Assert\NotBlank] wird zum Beispiel minLength: 1.

class SearchBooks
{
    /**
     * @param string $query The words to look for in the book titles
     */
    public function __invoke(
        string $query,
        #[JsonSchemaConstraint(minimum: 1, maximum: 100)]
        int $limit = 10,
    ): array {
        // ...
    }
}

$method = new \ReflectionMethod(SearchBooks::class, '__invoke');
$schema = $generator->generateForParameters($method->getParameters());

Die Komponente braucht nur PHP 8.2 und läuft mit den Symfony 7.4 Komponenten, Symfony AI kann sie also direkt nutzen. Für uns ist das der spannendste Baustein für KI Integration in PHP. Wie Agenten heute schon in laufende Symfony Apps schauen, erzählt Johannes Wachter in Symfony Mate, wie die Idee im Zug entstand. Mehr zur Komponente steht im Symfony Artikel zur JsonSchema Komponente.

Ein Bundle pro Komponente in Symfony 8.2

Die meisten Komponenten ziehen aus dem FrameworkBundle aus und bringen 29 eigene Bundles mit, zum Beispiel MailerBundle oder MessengerBundle. Ihr müsst nichts tun, die Bundles registrieren sich selbst und alle framework.* Keys funktionieren weiter. Wer aufräumen will, lässt die framework Ebene in der Config weg. Drei Keys heißen dann anders und Formulare schalten die Validierung nicht mehr still mit ein. Die Details haben wir im Symfony Glossar zusammengefasst.

Symfony 8.2 Performance ohne Codeänderung

Nicolas Grekas hat die Symfony Demo und ein API Projekt durchgemessen und jeden Fund in einen Pull Request gegossen. Laut Symfony Blog laufen Listen Routen einer API mit vielen serialisierten Objekten 14 bis 24 Prozent schneller. POST Requests im Dev Modus werden um 24 bis 38 Prozent schneller, der Cache Warmup wird kürzer. Dazu kommen ein kompilierter Event Dispatcher und Listener, die ihr relativ zueinander sortiert statt Prioritäten zu raten.

Eine Änderung betrifft euer Monitoring. Client Fehler mit 4xx Status loggt Symfony jetzt als warning statt error. Wer Alerts in Sentry oder Grafana auf diese Level gebaut hat, prüft die Regeln vor dem Update.

Weitere Neuerungen in Symfony 8.2

  • Logout per POST: neue Twig Funktionen logout_form() und logout_button(), APIs ohne Redirect und Back Channel Logout für OpenID Connect
  • Role Hierarchy: Wildcards, der neue Befehl debug:roles und ein Graph im Profiler
  • Mails: Signieren und Verschlüsseln mit PGP/MIME, sicherere S/MIME Defaults, Templates beim Mail Provider und Tracking pro Mail
  • Konfiguration: Symfony erzeugt ein JSON Schema für eure Config, der Editor bietet Autocomplete und Validierung für YAML
  • Übersetzungen: ein neuer Service und Twig Filter für Nachrichten mit HTML
  • Validator: neue Constraints EntityExists, Cron und Audio
  • HTTP: getrennte Cache Regeln für CDN und Browser, Cache-Status Header und HTTP Trailers im HttpClient
  • Serializer: flexiblere Serialisierungsgruppen und benannte Serializer für Controller und Messenger
  • MongoDB: Cache Adapter und Messenger Transport

Alle Feature Artikel sammelt Symfony in der Reihe Living on the edge zu Symfony 8.2.

Update auf Symfony 8.2 sicher durchführen

composer update "symfony/*" --with-all-dependencies
  • PHP 8.4 prüfen: lokal, im Image und in der CI.
  • Deprecations lesen: Signieren per Handler Option, send_unencrypted bei S/MIME und die alten Klassen aus dem FrameworkBundle sind deprecated.
  • Config prüfen: debug:config ohne framework Präfix, drei umbenannte Keys, Validierung über symfony/validator.
  • Logging prüfen: Alerts auf 4xx Fehler an das neue Log Level anpassen.
  • Console Skripte prüfen: Argumente, die wie ein Sub Command heißen, brauchen --.
  • Testen: PHPStan, PHPUnit, Integrationstests und ein E2E Durchlauf über die wichtigsten Seiten.

Viele Deprecations löst Rector PHP automatisch. Ob alle Services sauber im Container landen, zeigen Tests mit dem Symfony KernelTestCase. Was in PHPUnit gerade neu ist, steht in PHPUnit 13.4 mit Sebastian Bergmann. Wenn Coding Agents das Update vorbereiten, brauchen sie feste Regeln. Die liefern die NCA PHP AI Coding Guidelines. Und wenn es schon brennt, hilft die NCA Soforthilfe für Webprojekte.

Fazit

Symfony 8.2 nimmt Teams viel Code ab, den sie bisher selbst schreiben mussten. Login über OpenID Connect, Sudo Mode, verschlüsselte Spalten und eine Queue ohne doppelte Verarbeitung sind Themen, bei denen eigene Lösungen oft Lücken hatten. Die JsonSchema Komponente öffnet Symfony weiter für KI Agenten. Das Update ist dank Rückwärtskompatibilität planbar, wenn Tests und statische Analyse in der Pipeline laufen. Für uns bleibt Symfony zusammen mit Sulu das Fundament im Backend.

Häufige Fragen zu Symfony 8.2

Was ist 2026 neu in Symfony 8.2?

Symfony 8.2 bringt einen nativen OpenID Connect Login, einen Sudo Mode, die KeyManagement Komponente mit verschlüsselten Doctrine Spalten, Outbox, Inbox und Claim Check für Messenger, das Attribut #[Lock] für Controller, Formulare per Attribut, Console Sub Commands und die JsonSchema Komponente. Dazu bekommt jede Komponente ihr eigenes Bundle.

Wann erscheint Symfony 8.2 im Jahr 2026?

Symfony 8.2 erscheint im November 2026, wie im festen Release Zyklus mit Versionen im Mai und November vorgesehen. Die Version wird acht Monate gepflegt, das Support Ende ist für Juli 2027 geplant. Wer längeren Support braucht, bleibt auf Symfony 7.4 LTS.

Welche PHP Version braucht Symfony 8.2 im Jahr 2026?

Symfony 8.2 braucht mindestens PHP 8.4. Prüft die Version vor dem Update überall, also in lokalen Setups, Docker Images und CI Runnern. Die neue JsonSchema Komponente ist eine Ausnahme und läuft schon ab PHP 8.2 mit den Symfony 7.4 Komponenten.

Was ist der Sudo Mode in Symfony 2026?

Der Sudo Mode fragt vor sensiblen Aktionen erneut nach dem Passwort. Symfony 8.2 bringt dafür die Attribute IS_AUTHENTICATED_RECENTLY für eine Anmeldung in den letzten zwei Stunden und IS_AUTHENTICATED_VERY_RECENTLY für die letzten fünf Minuten. Ein Remember Me Cookie reicht für diese Prüfungen nicht.

Lohnt sich 2026 das Update auf Symfony 8.2?

Ja, vor allem für Anwendungen mit Logins, Queues und sensiblen Daten. Viele Features ersetzen eigenen Code oder Fremdpakete, und die Performance Verbesserungen gibt es ohne Änderung. Prüft vorher PHP 8.4, Deprecations und Log Alerts und sichert das Update mit Tests ab.

Symfony Projekte mit Never Code Alone

Wir bringen Symfony und Sulu Anwendungen mit eurem Team auf den aktuellen Stand: Update auf Symfony 8.2, Rector, PHPStan, PHPUnit, Cypress E2E Tests und saubere Pipelines. Kostenloses Kennenlernen, ehrliche Aufwandsschätzung, minutengenaue Abrechnung.

0 Kommentar

Tutorials und Top Posts

Gib uns Feedback

Diese Seite benutzt Cookies. Ein Akzeptieren hilft uns die Seite zu verbessern. Ok Mehr dazu