art-fatal/doctrine-enum-bundle
Installation:
composer require art-fatal/doctrine-enum-bundle
For Symfony without Flex, register the bundle in config/bundles.php:
ArtFatal\DoctrineEnumBundle\DoctrineEnumBundle::class => ['all' => true],
First Use Case:
Use the built-in DayOfWeek enum in an entity:
use ArtFatal\DoctrineEnumBundle\Enum\DayOfWeek;
use ArtFatal\DoctrineEnumBundle\Type\DayOfWeekEnumType;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Schedule {
#[ORM\Column(type: DayOfWeekEnumType::NAME)]
private ?DayOfWeek $dayOfWeek = null;
}
Generate Migration:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
src/Enum/ in the bundle for ready-to-use enums like DayOfWeek.make:enum for generating custom enums interactively.examples/ directory for complete usage patterns.Built-in Enums:
DayOfWeek or other pre-defined enums directly in entities.isWeekend(), label(), or toIsoNumber().Custom Enums via Generator:
php bin/console make:enum to scaffold enums and types.Enum name: UserStatus
Case #1: ACTIVE=active
Case #2: INACTIVE=inactive
src/Enum/UserStatus.php (enum class).src/Type/UserStatusEnumType.php (Doctrine type).Manual Enum Creation:
BackedEnum (e.g., Status: string).EnumType for the Doctrine type:
class UserStatusEnumType extends EnumType {
public const NAME = 'user_status';
public static function getEnumsClass(): string { return Status::class; }
}
#[ORM\Column(type: UserStatusEnumType::NAME)].Entity Integration:
#[Assert\Choice(choices: Status::ALL)]).options:
#[ORM\Column(type: 'user_status', options: ['default' => Status::ACTIVE->value])]
Database Migrations:
doctrine:migrations:diff and doctrine:migrations:migrate to create ENUM columns.ALTER TABLE user ADD status ENUM('active', 'inactive', 'banned') DEFAULT 'active' NOT NULL;
Development Workflow:
make:enum for rapid prototyping.isActive()).Refactoring:
EnumType::NAME constants over string literals for refactoring safety.// Safe (refactoring-friendly)
#[ORM\Column(type: UserStatusEnumType::NAME)]
// Less safe (string literal)
#[ORM\Column(type: 'user_status')]
Testing:
$this->assertTrue(DayOfWeek::SATURDAY->isWeekend());
Symfony Forms:
ChoiceType:
$builder->add('status', ChoiceType::class, [
'choices' => Status::cases(),
]);
API Responses:
value or custom methods:
return ['status' => $user->getStatus()->value];
Querying:
$activeUsers = $entityManager->getRepository(User::class)
->findBy(['status' => Status::ACTIVE]);
DQL:
$query = $entityManager->createQuery(
'SELECT u FROM App\Entity\User u WHERE u.status = :status'
)->setParameter('status', Status::ACTIVE);
PHP 8.1 Requirement:
BackedEnum support.Class 'BackedEnum' not found if using PHP < 8.1.Enum Case Values:
ENUM columns are case-sensitive by default.'active' vs 'Active').Migration Conflicts:
ENUM values don’t match.Circular Dependencies:
Cannot autowire service if Doctrine can’t resolve dependencies.Type Safety:
?Enum in entity properties can cause NULL issues.// Correct (nullable)
private ?Status $status = null;
// Incorrect (non-nullable)
private Status $status; // Throws if NULL
Custom Enum Methods:
CASE expressions in DQL or add static methods to the enum.Enum Not Registered:
DoctrineEnumBundle is enabled in config/bundles.php.EnumType class extends ArtFatal\DoctrineEnumBundle\Type\EnumType.php bin/console cache:clear
Database Errors:
ENUM values in the database match the enum cases exactly.php bin/console doctrine:schema:update --dump-sql
IDE Autocomplete:
composer dump-autoload.Validation Errors:
#[Assert\Choice] to validate enum values in forms/entities.#[Assert\Choice(choices: Status::cases(), message: 'Invalid status.')]
Naming Conventions:
PascalCase for enum classes (e.g., UserStatus).snake_case for type constants (e.g., user_status).class UserStatusEnumType extends EnumType {
public const NAME = 'user_status'; // snake_case
}
Reusable Enums:
App\Enum).src/
├── Enum/
│ ├── User/
│ │ └── Status.php
│ └── Order/
│ └── State.php
└── Type/
├── Enum/
│ ├── UserStatusEnumType.php
│ └── OrderStateEnumType.php
Enum Utilities:
enum Status {
case ACTIVE, INACTIVE;
public static function isActive(Status $status): bool {
return $status === self::ACTIVE;
}
}
Performance:
ENUM columns are efficient for lookups but may impact performance with many values (>64).string columns with application-level validation if enums grow large.Testing Enums:
public function testEnumMethods() {
$this->assertEquals('Active', Status::ACTIVE->label());
$this->
How can I help you explore Laravel packages today?