Black Friday: 30 % Rabatt auf alle Trainings und 10 % Rabatt auf alle Dienstleistungen Hol dir ein Angebot


Typensichere IDs mit Symfony und Doctrine: Verwendung dedizierter ID-Klassen

· Oskar Stark · 2 Minuten zum Lesen
type-safety-uuid

Lerne, wie du die Typensicherheit in Symfony und Doctrine durch die Verwendung dedizierter ID-Klassen wie BookId und UserId anstelle roher UUIDs verbessern kannst. Dieser Ansatz verhindert die Verwechslung von IDs, verbessert die Codeklarheit und sorgt für eine bessere Integration mit Symfony Messenger und Repository-Methoden. Entdecke praxisnahe Beispiele und Best Practices zur Implementierung typsicherer IDs in deinen Symfony-Anwendungen.

Beim Arbeiten mit Symfony und Doctrine ist die Verwendung von UUIDs als Entitätskennungen eine gängige Vorgehensweise. Traditionell werden IDs als einfache Ganzzahlen oder als rohe Uuid-Objekte gespeichert. Dies kann jedoch zu Verwechslungen führen, insbesondere beim Arbeiten mit Symfony Messenger oder Repository-Methoden. Ein robusterer und typsicherer Ansatz besteht darin, dedizierte ID-Klassen zu verwenden.

Warum dedizierte ID-Klassen verwenden?

Durch die Verwendung einer dedizierten ID-Klasse, wie BookId oder UserId, wird sichergestellt, dass Kennungen nicht versehentlich vertauscht werden. Dies ist besonders nützlich beim Arbeiten mit Symfony Messenger-Nachrichten, in denen mehrere UUIDs übergeben werden. Zum Beispiel:

namespace App\Message;

final readonly class MarkBookAsRead
{
    public function __construct(
        public BookId $bookId,
        public UserId $userId,
    ) {}
}

Mit diesem Ansatz wird sichergestellt, dass eine BookId niemals mit einer UserId verwechselt wird. Würden wir generische UUIDs verwenden, könnten die Parameter leicht vertauscht werden, was zu schwer Fehlern führen kann.

Implementierung einer dedizierten ID-Klasse

So kann eine dedizierte ID-Klasse für ein Book-Entity definiert werden:

namespace App\Domain;

use Symfony\Component\Uid\Ulid;

final class BookId extends Ulid
{
}

Nun kann diese Klasse im Book-Entity verwendet werden:

namespace App\Entity;

use App\Domain\BookId;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Book
{
    #[ORM\Id]
    #[ORM\Column(type: 'uuid', unique: true)]
    private BookId $id;

    public function __construct()
    {
        $this->id = new BookId();
    }

    public function getId(): BookId
    {
        return $this->id;
    }

    // ...
}

Der benötigte Doctrine-Typ

Das letzte Code-Beispiel liefert uns folgende Exception:

Cannot assign Symfony\Component\Uid\Ulid to property App\Entity\Book::$id of type App\Entity\BookId

Um das zu beheben, benötigen wir einen BookIdType :

namespace App\Doctrine\Type;

use App\Domain\BookId;
use Symfony\Bridge\Doctrine\Types\AbstractUidType;

final class BookIdType extends AbstractUidType
{
    public function getName(): string
    {
        return self::class;
    }

    protected function getUidClass(): string
    {
        return BookId::class;
    }
}

welcher registriert und benutzt werden muss:

# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            App\Doctrine\Type\BookIdType: App\Doctrine\Type\BookIdType
namespace App\Entity;

+use App\Doctrine\Type\BookIdType;
use App\Domain\BookId;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Book
{
    #[ORM\Id]
-   #[ORM\Column(type: 'ulid', unique: true)]
+   #[ORM\Column(type: BookIdType::class, unique: true)]

    private BookId $id;

    public function __construct()
    {
        $this->id = new BookId();
    }

    public function getId(): BookId
    {
        return $this->id;
    }

    // ...
}

Typsichere Repository-Methoden

Ein weiterer Vorteil sind typsichere Repository-Methoden. Anstatt Entities mit einer generischen string-UUID abzufragen, kann die Typensicherheit auf Methodenniveau erzwungen werden:

namespace App\Repository;

use App\Domain\BookId;
use App\Entity\Book;

final class BookRepository
{
    public function get(BookId $id): Book
    {
        $book = $this->find($id->toString());
        if (null === $book) {
            throw BookNotFoundException::withId($id);
        }
        return $book;
    }
}

Und eine aussagekräftige Exception definieren:

namespace App\Exception;

use App\Domain\BookId;

final class BookNotFoundException extends \RuntimeException
{
    public static function withId(BookId $id): self
    {
        return new self(sprintf('Buch mit der ID %s nicht gefunden.', $id->toString()));
    }
}

Fazit

Die Verwendung dedizierter ID-Klassen in Symfony mit Doctrine bietet Typensicherheit, reduziert das Risiko von Verwechslungen bei Kennungen und verbessert die Codeklarheit. Dies ist besonders nützlich beim Arbeiten mit Symfony Messenger und Repository-Methoden, wo eine falsche ID-Handhabung zu Laufzeitfehlern führen kann. Durch die Implementierung dedizierter ID-Klassen entsteht eine robustere und besser wartbare Codebasis.

Nutze jetzt ID Klassen!

SensioLabs hilft Teams dabei, Best Practices für wartbare und skalierbare Software umzusetzen. Kontaktiere uns noch heute, um mehr zu erfahren!

Das könnte dich auch interessieren

The SensioLabs team celebrating the 20th anniversary of Symfony with balloons
Jules Daunay

Die Geschichte geht weiter: SensioLabs feiert 20 Jahre Symfony

Die Zeit vergeht wie im Flug – besonders, wenn man an der Zukunft der Entwicklung schreibt! Das SensioLabs-Team hat gerade die 20 Kerzen des Symfony-Frameworks ausgeblasen. Wir haben den Anlass im Büro gefeiert, doch die Party ist noch nicht vorbei. Das Datum für eine XXL-Feier steht bereits fest: die SymfonyCon Amsterdam vom 27. bis 28. November 2025.

Mehr erfahren
3 dog heads
Mathieu Santostefano

Lass die Nutzer des SDK ihren eigenen HTTP-Client nutzen

Befreie dich von starren Abhängigkeiten in deinen PHP-SDKs. Erfahre, wie du die Standards PSR-7, PSR-17 und PSR-18 zusammen mit PHP-HTTP/Discovery nutzt, um deinen Benutzern die Verwendung ihres bevorzugten HTTP-Clients zu ermöglichen – sei es Guzzle, Symfony HttpClient oder ein anderes Tool. Ein Muss für PHP- und Symfony-Entwickler.

Mehr erfahren
Blue sign on a building with several Now What? letters
Thibaut Chieux

Wie man Nachrichten beim Aufbau asynchroner Anwendungen mit dem Symfony-Messenger priorisiert

Die asynchrone Verarbeitung bietet Vorteile wie entkoppelte Prozesse und schnellere Reaktionszeiten. Die Verwaltung von Nachrichtenprioritäten kann jedoch zu einer Herausforderung werden. Bei Aufgaben, die vom Zurücksetzen von Passwörtern bis hin zu komplexen Exporten reichen, ist die rechtzeitige Zustellung kritischer Nachrichten unerlässlich. Dieser Artikel befasst sich mit häufigen Problemen bei der asynchronen Verarbeitung und zeigt Lösungen mit Symfony Messenger auf, mit denen Sie Ihre Anwendung ohne umfangreiches Refactoring optimieren können.

Mehr erfahren
SensioLabs University Courses announcing the new level 3 Master training course now available
Jules Daunay

Wir stellen vor: Mastering Symfony 7

Wenn du deine Symfony-Kenntnisse verbessern möchtest, ist der neue Level-3 Trainingskurs bei SensioLabs vielleicht das Richtige für dich! Du meisterst komplexe Themen, optimierst die Leistung und wirst zum Symfony-Experten.

Mehr erfahren
Two images: on the left many cars stuck in a traffic jam with the sign "All directions" above, on the right a blue car moving forward alone on the highway with the sign "Service Subscriber" and a Symfony logo above
Steven Renaux

Symfony Lazy Services mit Stil – Steigere deine Entwicklererfahrung mit Service Subscribers

Steigere die Performance und Developer Experience (DX) deiner Symfony-App! Erfahre, wie du Service Subscribers und Traits für das verzögerte Laden von Services verwendest, um die sofortige Instanziierung zu reduzieren, Abhängigkeiten zu vereinfachen und modularen, wartbaren Code zu schreiben.

Mehr erfahren
Poster of Guillaume Loulier presentation
Salsabile El-Khatouri

Ein Symfony-Training bei SensioLabs: Hinter den Kulissen

Wie sieht die Symfony-Schulung bei SensioLabs aus? Erfahren Sie es im Interview mit Guillaume Loulier, einem leidenschaftlichen Entwickler und Trainer, der uns alles über die offiziellen Symfony-Schulungen erzählt.

Mehr erfahren
Toy factory production line
Silas Joisten

Symfony-Tests mit Zenstruck Foundry auf das nächste Level bringen

Zenstruck Foundry hat die Art und Weise, wie wir Tests in Symfony schreiben, revolutioniert. In diesem Beitrag erfährst du, wie uns ausdrucksstarke Factories, isolierte Testdaten und ein reibungsloseres Entwicklererlebnis dabei geholfen haben, unseren Test-Workflow zu optimieren und die Produktivität zu steigern.

Mehr erfahren
Photo speaker meetup AI Symfony
Jules Daunay

Symfony und AI: das Video ist jetzt verfügbar

Was ist mit Symfony und Artificial Intelligence (AI)? Dies war das Thema der exklusiven Veranstaltung, die von SensioLabs in Zusammenarbeit mit Codéin am 3. Oktober organisiert wurde. Mit dem zusätzlichen Bonus des Feedbacks aus einem Entwicklungsprojekt, das Symfony und AI kombiniert. Falls du die Veranstaltung verpasst hast, schau dir das Video an, das jetzt kostenlos auf unserem Youtube-Kanal verfügbar ist.

Mehr erfahren
2025 a year of celebrations for PHP with windows about API Platform, PHP, AFUP and Symfony
Jules Daunay

2025: Das Jahr der Jubiläen für PHP, AFUP, Symfony und API Platform

2025 wird ein großes Jubiläumsjahr. Wir feiern 20 Jahre Symfony, 30 Jahre PHP, 25 Jahre AFUP und 10 Jahre API Platform. Für SensioLabs ist dies ein wichtiger Meilenstein, der die Langlebigkeit der Technologien in unserem Ökosystem beweist. Wir sind stolz darauf, diese Jubiläen das ganze Jahr über mit der Community zu feiern.

Mehr erfahren
SymfonyDay Chicago 2025
Simon André

SymfonyDay Chicago 2025: Die Community feiern

Am 17. März traf sich die Symfony-Community in Chicago zum SymfonyDay 2025. Das Event - passend zum St. Patrick’s Day - war nicht nur eine Feier von Symfony, sondern auch ein Moment, um Ryan Weaver in seinem Kampf zu unterstützen. Es war mehr als nur eine Konferenz - es war ein Treffen rund um ein geschätztes Mitglied unserer Community.

Mehr erfahren
Summer Sales: 25% off Trainings
Salsabile El-Khatouri

Diesen Sommer auf dem Symfony-Podium stehen!

Der Sommer wird aufregend mit der Euro Cup und den Olympischen Spielen 2024 in Paris. Während du den Sport genießt, warum nicht dich selbst herausfordern mit den neuesten Versionen von Symfony und PHP? Den ganzen Sommer über bietet SensioLabs dir die Werkzeuge, die du brauchst, um deine Leistung zu steigern und dich als Top-Symfony-Entwickler zu profilieren. Bereit, fertig, los!

Mehr erfahren
Oskar Stark joins SensioLabs De
Jules Daunay

SensioLabs Deutschland ernennt neuen Geschäftsführer: Oskar Stark

Oskar Stark, Mitglied des Symfony Core-Teams, wurde zum Geschäftsführer von SensioLabs Deutschland ernannt. Diese neue Ergänzung im Team wird das Wachstum von SensioLabs Deutschland, der offiziellen Niederlassung von SensioLabs in Deutschland, zum Vorteil der deutschsprachigen Symfony-Nutzer fördern.

Mehr erfahren
SymfonyLive 2024
Jules Daunay

SymfonyLive Paris 2024: Zwei Tage Konferenz und Spaß

Am 28. und 29. März versammelten sich das SensioLabs-Team und die französischsprachige Symfony-Community an der Cité Internationale Universitaire in Paris zur SymfonyLive Paris 2024.

Mehr erfahren
Some speaker
Jules Daunay

Entdecken Sie unsere Symfony-Veranstaltungen im Februar 2024

Der Februar war ein geschäftiger Monat für SensioLabs in Bezug auf Symfony-Veranstaltungen. Wir nahmen an Symfony-Meetups und Konferenzen in Frankreich, der Schweiz, England und schließlich Kanada teil.

Mehr erfahren
Symfony 7 Certification
Salsabile El-Khatouri

Symfony 7 Schulungen sind jetzt verfügbar!

Symfony 7 wurde im November 2023 veröffentlicht. Als Erfinder von Symfony bietet SensioLabs die offiziellen Schulungen zu dieser neuen Version des Frameworks an. Entdecken Sie unsere neuen Symfony 7 Schulungsprogramme in diesem Artikel.

Mehr erfahren
Image