Using Enums with PHP 8.1

Doctrine ORM 2.11 introduced support for PHP 8.1 enums. To make use of backed enums with doctrine-laminas-hydrator, you need to set up a hydration strategy.

The Enum and Entity

The following example uses a card with an enum representing hearts, diamonds, clubs or spades:

1enum Suit: string { case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } #[Entity] class Card { /** ... */ #[Column(type: 'string', enumType: Suit::class)] public Suit $suit; public function getSuit(): Suit { return $this->suit; } public function setSuit(Suit $suit): void { $this->suit = $suit; } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Custom Hydration Strategy

Next, you need to create a hydration strategy for your backed enum:

1namespace Application\Hydrator\Strategy; use Laminas\Hydrator\Strategy\StrategyInterface; class SuitHydratorStrategy implements StrategyInterface { public function extract($value, ?object $object = null): ?int { return null === $value ? null : Suit::tryFrom($value)->value; } public function hydrate($value, ?array $data): ?Suit { return null === $value ? null : Suit::tryFrom($value); } }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Usage Example

Once you have enum, entity and strategy set up, you can wire it all together by adding the strategy to the relevant field in your hydrator.

1$hydrator = new DoctrineHydrator($entityManager); $hydrator->addStrategy('suit', new \Application\Hydrator\Strategy\SuitHydratorStrategy()); $card = new Card(); $hydrator->hydrate([ 'suit' => 'H' ], $card);
2
3
4
5