Install the Bundle
composer require fervo/enum-bundle "^2.0"
(Note: The README mentions fervo/enum-bundle, but the GitHub repo is demoniacdeath/enum-bundle. Verify the correct package name in your project.)
Enable the Bundle
Add to config/bundles.php (Symfony 4+) or AppKernel.php (Symfony 3-):
return [
// ...
Fervo\EnumBundle\FervoEnumBundle::class => ['all' => true],
];
Configure an Enum
Define a basic enum in config/packages/fervo_enum.yaml:
fervo_enum:
enums:
App\Entity\Enum\Status:
doctrine_type: status
form_type: status
Create Your First Enum
Define an enum class (e.g., src/Entity/Enum/Status.php):
namespace App\Entity\Enum;
use MyCLabs\Enum\Enum;
class Status extends Enum
{
const ACTIVE = 'active';
const INACTIVE = 'inactive';
}
Use in a Doctrine Entity Annotate a field in your entity:
use App\Entity\Enum\Status;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class User
{
/**
* @ORM\Column(type="status")
*/
private $status;
}
Use in a Form
Auto-generated form type (FervoEnumBundle\Generated\Form\StatusType) or manually:
use App\Entity\Enum\Status;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('status', EnumType::class, [
'class' => Status::class,
'choice_label_prefix' => 'status',
]);
}
}
Enum-Centric Development
UserRole, OrderStatus). Reuse them across entities, forms, and services.UserRole → doctrine_type: user_role, form_type: user_role).Doctrine Integration
doctrine_type in fervo_enum.yaml to map enums to database columns (e.g., string, integer).$query->andWhere('u.status = :status')
->setParameter('status', Status::ACTIVE);
Form Handling
FervoEnumBundle\Generated\Form\*Type) for DRY forms.EnumType with options:
->add('status', EnumType::class, [
'class' => Status::class,
'choice_label_prefix' => 'custom_prefix.', // Override translation domain
'expanded' => true, // Render as checkboxes/radio buttons
])
API/Serialization
@JMS\Type("status") (where status matches doctrine_type).#[ApiProperty(enumType: Status::class)] for OpenAPI docs.Validation
Choice constraint:
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\Choice(callback: [Status::class, 'getValues'])
*/
private $status;
Services/Business Logic
public function processOrder(Order $order, Status $status) { ... }
class Status extends Enum {
public static function isActive($value) {
return self::from($value) === self::ACTIVE;
}
}
enums.status.active).choice_label_prefix in forms to dynamically prefix keys:
# translations/messages.en.yaml
status:
active: "Active"
inactive: "Inactive"
doctrine_type column exists before using the enum in entities.string → status).$this->assertEquals(Status::ACTIVE, Status::from('active'));
$form->submit(['status' => 'active']);
$this->assertEquals(Status::ACTIVE, $form->getData()->getStatus());
Bundle Name Mismatch:
fervo/enum-bundle, but the repo is demoniacdeath/enum-bundle. Verify the correct package name in composer.json to avoid autoloading errors.Caching Issues:
php bin/console cache:clear
config/packages/dev/fervo_enum.yaml:
fervo_enum:
debug: true
Doctrine Type Conflicts:
doctrine_type clashes with existing Doctrine types (e.g., string), rename it or use a custom type mapping:
doctrine:
dql:
string_functions:
ENUM_VALUE: App\Doctrine\EnumValueFunction
Enum Value Casting:
castValueIn/castValueOut methods. Forgetting this causes serialization/deserialization errors:
class Status extends Enum {
public const SUCCESS = 1;
public static function castValueIn($value) { return (int)$value; }
}
Translation Key Conflicts:
status.active for two different enums) cause the wrong value to render. Use unique prefixes:
# For UserStatus
user_status:
active: "User Active"
# For OrderStatus
order_status:
active: "Order Active"
ParamConverter Limitations:
@ParamConverter only works for exact enum value matches. For dynamic values, use a custom converter:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use App\Entity\Enum\Status;
/**
* @ParamConverter("status", converter="enum_converter")
*/
public function showAction(Status $status) { ... }
Legacy Database Data:
1 for Status::ACTIVE), ensure castValueIn handles conversion:
public static function castValueIn($value) {
return in_array($value, [1, '1']) ? self::ACTIVE : $value;
}
Check Generated Form Types:
vendor/fervo/enum-bundle/Generated/Form/{EnumClass}Type.php.debug: true) to regenerate types.Doctrine Logging:
# config/packages/dev/doctrine.yaml
doctrine:
dbal:
logging: true
logging_format: '%%sql%%'
Enum Validation:
Enum::isValid() to check values before saving:
if (!Status::isValid($value)) {
throw new \InvalidArgumentException("Invalid status: $value");
}
Form Debugging:
dump($form->getData()->getStatus()->getValue());
Fervo\EnumBundle\Doctrine\EnumType to support custom behavior (e.gHow can I help you explore Laravel packages today?