Kontakt aufnehmen
Backend 1 Min. Lesezeit · 09/2022

PHP8.1, Enum-Klassen und Doctrine

Zu den Neuerungen in PHP8.1 gehört auch die Unterstützung von Enum-Klassen. Dieser Beitrag ist eine kurze Einführung, wie sich diese Neuerung zusammen mit Doctrine nutzen lässt.

Die Unterstützung von Enum-Klassen hielt schrittweise Einzug in Doctrine, aber seit Version 2.12.0 lassen sich Enums in Symfony-Entities und -Repositories einfach verwenden. Unterstützt werden BackedEnums, die einen string- oder int-Wert enthalten, der in der Datenbank persistiert werden kann.

Beispiel – Definition einer Enum-Klasse

php
<?php

namespace App\Enum\Advert;

enum EstateType: string
{
    case FLAT = 'flat';
    case HOUSE = 'house';
}

Beispiel – Definition einer Entity

Definition der Eigenschaft estateType

  • In der Annotation muss je nach Typ des Enums der MySQL-Typ string oder int angegeben sein.
  • In die Annotation muss enumType aufgenommen werden, z. B. enumType=Enum\Advert\EstateType::class
  • Ein Standardwert kann mithilfe des Enums definiert werden.
  • Enums lassen sich auch bei Eigenschaften vom Typ array verwenden.

Getter und Setter

Wird ein Enum in der Definition der Eigenschaft verwendet, müssen Sie nicht mehr mit den konkreten Werten (string oder int) arbeiten, da Doctrine direkt das Enum zurückgibt.

php
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use App\Enum;

/**
 * @ORM\Table(name="advert")
 * @ORM\Entity(repositoryClass="App\Repository\AdvertRepository")
 */
class Advert
{
    ...

    /**
     * @ORM\Column(
     *    name="estate_type", 
     *    type="string", 
     *    enumType=Enum\Advert\EstateType::class, 
     *    length=20, 
     *    nullable=false
     * )
     */
    private Enum\Advert\EstateType $estateType = Enum\Advert\EstateType::FLAT;
  
    public function setEstateType(Enum\Advert\EstateType $estateType): Advert
    {
        $this->estateType = $estateType;

        return $this;
    }

    public function getEstateType(): Enum\Advert\EstateType
    {
        return $this->estateType;
    }

    ...

Repository

Mit Enums können Sie auch in den findBy-Methoden der Repositories arbeiten.

php
$advertRepository = $this->em->getRepository(Entity\Advert::class);
return $advertRepository->findBy(['estateType' => Enum\Advert\EstateType::FLAT]);

Ebenso lassen sie sich als Parameterwerte an den QueryBuilder übergeben.

php
$qb = $this->createQueryBuilder('advert');
$qb
    ->where('advert.estateType = :estateType')
    ->setParameter('estateType', Enum\Advert\EstateType::FLAT);
Teilen
LinkedIn Facebook

Brauchen Sie mehr als einen Artikel?

Melden Sie sich unverbindlich – ein paar Sätze dazu, worum es geht, genügen.

Weiterlesen

Ähnliche Artikel

Weitere Notizen aus Betrieb und Entwicklung.

Gesamter Ratgeber