Add the package to your project :
composer require mesavolt/named-enumDefine a class that extends Mesavolt\Enum\NamedEnum with your enum values and names.
The values should be defined as class constants (their visibility is up to you)
and the names should be declared in a protected static class variable $VALUE_NAMES,
indexed by the corresponding value.
Quick note: By default,
NamedEnum::getName($value)silently ignores undefined values and returnsnullfor any undefined value. You can extendMesavolt\Enum\StrictNamedEnumfor a strict check that will throw an\InvalidArgumentExceptionif you pass an undefined enum value togetName($value).
<?php
namespace App;
use Mesavolt\Enum\NamedEnum;
abstract class MyEnum extends NamedEnum
{
public const FOO = 'foo';
public const BAR = 'bar';
protected static $VALUE_NAMES = [
self::FOO => 'Foo name',
self::BAR => 'Bar name',
];
}Use it in your project :
<?php
use App\MyEnum;
$object = new stdClass();
$object->foo = MyEnum::BAR;
echo MyEnum::getName($object->foo); // Bar nameCheck NamedEnum's public methods for more usages examples.
If you use the default
auto-configuring feature of Symfony introduced in Symfony 3.3,
you only need to register the Mesavolt\Twig\NamedEnumExtension as a service in your services.yml file.
Symfony will tag it properly to register it in the twig environment used by your app.
If you don't use the auto-configuring feature or if it's not available in your version, you need to apply the tags manually when you register the extension as a service.
# Symfony 3: app/config/services.yml
# Symfony 4: config/services.yaml
services:
# Use this if you use the default auto-configuring feature of Symfony >=3.3 DI container
Mesavolt\Twig\NamedEnumExtension: ~
# Use this if you **don't** use the auto-configuring feature of Symfony >=3.3 DI container
app.named_enum_extension:
class: Mesavolt\Twig\NamedEnumExtension
tags: { name: twig.extension }Then, you can use the enum_name filter and the enum_name function provided by the extension, in your templates :
<?php
// src/Controller/HomeController.php
// This is an example for Symfony 4.
// The code is exactly the same for Symfony 3, only the file locations change.
namespace App\Controller;
use App\Enum;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class HomeController extends Controller
{
public function index()
{
return $this->render('my-template.html.twig', [
'value1' => Enum::FOO,
'value2' => Enum::BAR
]);
}
}{# templates/my-template.html.twig #}
You selected "{{ value1|enum_name('\\App\\MyEnum') }}"
{# You selected "Foo name" #}
You selected {"{ enum_name(value2, '\\App\\MyEnum') }}"
{# You selected "Bar name" #}
composer dump-autoload # make sure vendor/autoload.php exists
./vendor/bin/phpunit