Add the package to your project :
composer require mesavolt/named-enum
Define 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 returnsnull
for any undefined value. You can extendMesavolt\Enum\StrictNamedEnum
for a strict check that will throw an\InvalidArgumentException
if 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 name
Check 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