acelaya/doctrine-enum-type
Doctrine DBAL type for mapping MyCLabs\Enum\Enum values to entity columns. Provides a reusable PhpEnumType to register enums as custom Doctrine types. Note: largely obsolete now that PHP has native enums and Doctrine supports them.
Installation
composer require acelaya/doctrine-enum-type:^2.5.0
Ensure myclabs/php-enum is installed (dependency). This version now supports doctrine/dbal 3.0.
Register the Type
Add to your Doctrine orm.xml or EntityManager configuration:
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<driver name="enum_driver" class="Acelaya\DoctrineEnumType\EnumTypeDriver"/>
</doctrine-mapping>
First Use Case
Define an enum (e.g., UserRole.php):
use MyCLabs\Enum\Enum;
class UserRole extends Enum
{
const ADMIN = 'admin';
const USER = 'user';
}
Apply it to an entity field:
use Doctrine\ORM\Mapping as ORM;
use Acelaya\DoctrineEnumType\Type\EnumType;
#[ORM\Entity]
class User
{
#[ORM\Column(type: EnumType::NAME, enumType: UserRole::class)]
private $role;
}
Saving Enums
$user = new User();
$user->setRole(UserRole::ADMIN); // Stores 'admin' in DB
$em->persist($user);
Querying Enums
$admins = $em->createQueryBuilder()
->from(User::class, 'u')
->where('u.role = :role')
->setParameter('role', UserRole::ADMIN)
->getQuery()
->getResult();
Form Handling (Symfony)
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
$builder->add('role', ChoiceType::class, [
'choices' => UserRole::toArray(), // ['admin' => 'admin', 'user' => 'user']
]);
Schema::create('users', function (Blueprint $table) {
$table->enum('role', ['admin', 'user']);
});
use Symfony\Component\Validator\Constraints as Assert;
#[ORM\Column(type: EnumType::NAME, enumType: UserRole::class)]
#[Assert\Type(type: UserRole::class)]
private $role;
Archived Package Risk
league/enum (modern PHP 8+ enums)dama/doctrine-test-bundle (for testing)spatie/laravel-enum for Eloquent integration.Enum Class Naming
App\Enum\UserRole). Underscore-separated enums (e.g., User_Role) may fail silently.Case Sensitivity
ADMIN ≠ admin). Use strtoupper() if the DB defaults to uppercase.Hybrid Properties
@ORM\Column(type: EnumType::NAME) with @ORM\Column(type: 'string') on the same field.DBAL Version Mismatch
acelaya/doctrine-enum-type:^2.4 if needed.InvalidArgumentException if a DB value isn’t in the enum. Validate with:
if (!UserRole::isValid($value)) { /* handle error */ }
EnumType::NAME in DQL (not the enum class name):
->where('u.role = :role')
->setParameter('role', UserRole::ADMIN->value) // or ->getValue()
Custom Enum Types
Override Acelaya\DoctrineEnumType\Type\EnumType for non-MyCLabs enums (e.g., Spatie enums).
Database-Specific Quirks
ENUM type (optimized storage).text type with a check constraint:
$table->string('role')->constraint('role', ['admin', 'user']);
Laravel-Specific
spatie/laravel-enum for seamless casting:
use Spatie\LaravelEnum\HasEnums;
class User extends Model
{
use HasEnums;
protected $casts = ['role' => UserRole::class];
}
CI/CD Updates
How can I help you explore Laravel packages today?