This repository aims to provide simple enumeration implementation to Symfony.
Warning
This bundle is deprecated and will no longer be maintained.
It was created at a time when PHP had no enums, and Symfony had no way to deal with them. Since PHP 8.1 introduced native enums, and Symfony added native support for them in many of its components, this bundle has no reason to exist anymore.
We encourage you to migrate to a PHP native enum, and use what Symfony & Doctrine provide:
- Forms: use Symfony's
EnumTypeform type. - Doctrine: use the
enumTypeoption of the#[ORM\Column]mapping. - Validation: type your properties with the enum itself, invalid values cannot exist anymore.
- Translation: implement Symfony's
TranslatableInterfaceon your enum. Symfony'sEnumTypewill use it to translate choice labels, and you can translate values in Twig templates with thetransfilter:{{ member.status|trans }}.
use Symfony\Contracts\Translation\TranslatableInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
enum Status: string implements TranslatableInterface
{
case New = 'new';
case Validated = 'validated';
case Disabled = 'disabled';
public function trans(TranslatorInterface $translator, ?string $locale = null): string
{
return $translator->trans('status.' . $this->value, locale: $locale);
}
}$ composer require yokai/enum-bundle<?php
return [
Yokai\EnumBundle\YokaiEnumBundle::class => ['all' => true],
];Let's take an example : our application has some members
and each member has a status which can be :
new, labelled as "New"validated, labelled as "Validated"disabled, labelled as "Disabled"
We first need to create the class that will handle our enum :
<?php
declare(strict_types=1);
namespace App\Enum;
use Yokai\EnumBundle\Enum;
class StatusEnum extends Enum
{
public function __construct()
{
parent::__construct(['New' => 'new', 'Validated' => 'validated', 'Disabled' => 'disabled']);
}
}That's it, the bundle now knows your enum.
note : every enum has a name. That name is the enum identifier across your application. You can use any string for that purpose, as long it is unique. Using the enum class here is a very common way to do.
We will now be able to configure Member's model validation :
<?php
declare(strict_types=1);
namespace App\Model;
use App\Enum\StatusEnum;
use Yokai\EnumBundle\Validator\Constraints\Enum;
class Member
{
#[Enum(enum: StatusEnum::class)]
public ?string $status = null;
}Now that validation is configured, the only thing we have to do is to add a field on our form :
<?php
declare(strict_types=1);
namespace App\Form\Type;
use App\Model\Member;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MemberType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
// Because we added the #[Enum] constraint to Member::$status property
// the bundle will be able to find out the appropriate form type automatically
->add('status')
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefault('data_class', Member::class);
}
}Display label of any enum value within a Twig template :
{{ member.status|enum_label('App\\Enum\\StatusEnum') }}Now, maybe you will need to display the enum label in different locales.
We got you covered here with a dedicated base class for your translated enums :
<?php
declare(strict_types=1);
namespace App\Enum;
use Symfony\Contracts\Translation\TranslatorInterface;
use Yokai\EnumBundle\TranslatedEnum;
class StatusEnum extends TranslatedEnum
{
public function __construct(TranslatorInterface $translator)
{
parent::__construct(['new', 'validated', 'disabled'], $translator, 'status.%s');
}
}Now you can create the translation keys in your catalog :
# translations/messages.en.yaml
status.new: New
status.validated: Validated
status.disabled: Disabled
# translations/messages.fr.yaml
status.new: Nouveau
status.validated: Validé
status.disabled: Désactivénote : the translation key format is generated using the
$transPatternconstructor argument, which must be valid a sprintf pattern (containing one%s)
See examples from unit test suite & associated tests.
See example Symfony project in integration test suite.
- Creating enums
- Creating translated enums
- Integration with PHP native enum
- Integration with myclabs/php-enum
- Migrating from standard Symfony
- Integration with SonataAdminBundle
License can be found here.
The bundle was originally created by Yann Eugoné. See the list of contributors.
Thank's to PrestaConcept for supporting this bundle.