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.
In diesem Artikel
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
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
stringoderintangegeben 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
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.
$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.
$qb = $this->createQueryBuilder('advert');
$qb
->where('advert.estateType = :estateType')
->setParameter('estateType', Enum\Advert\EstateType::FLAT);