You are browsing a version that is no longer maintained.

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:

enum 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;    }}

Custom Hydration Strategy

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

namespace 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);    }}

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.

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