Бандл предоставляет возможность использовать любой класс с константами в качестве ENUM
.
Главной особенностью является уход от работы с рефлексией во время исполнения. Данная оптимизация достигается благодаря сбору всех данных о константах классов на этапе компиляции контейнера.
Откройте консоль и, перейдя в директорию проекта, выполните следующую команду для загрузки наиболее подходящей стабильной версии этого бандла:
composer require wakeapp/enumer-bundle
Эта команда подразумевает что Composer установлен и доступен глобально.
После включите бандл добавив его в список зарегистрированных бандлов в app/AppKernel.php
файл вашего проекта:
<?php declare(strict_types=1);
// app/AppKernel.php
class AppKernel extends Kernel
{
// ...
public function registerBundles()
{
$bundles = [
// ...
new Wakeapp\Bundle\EnumerBundle\WakeappEnumerBundle(),
];
return $bundles;
}
// ...
}
Чтобы начать использовать бандл предварительная конфигурация не требуется и имеет следующее значение по умолчанию:
wakeapp_enumer:
# список директорий, в которых будет происходить поиск классов, реализующих EnumInterface
source_directories:
- 'src'
# список классов, которые следует зарегистрировать вне зависимости от реализации EnumInterface
source_classes: ~
Чтобы зарегистрировать класс, содержащий константные значения, и использовать его в качестве enum
- необходимо
добавить реализацию EnumInterface.
<?php declare(strict_types=1);
namespace Acme\Enum;
use Wakeapp\Bundle\EnumerBundle\Enum\EnumInterface;
class GenderEnum implements EnumInterface
{
const MALE = 'Male';
const FEMALE = 'Female';
}
Все классы, реализующие EnumInterface, будут доступны для работы с ними в сервисе
wakeapp_enumer.enum_registry
(также сервис доступен при вызове посредством autowire
).
<?php declare(strict_types=1);
namespace Example;
use Acme\Enum\GenderEnum;
use Symfony\Component\DependencyInjection\Container;
/** @var Container $container */
$enumerRegistry = $container->get('wakeapp_enumer.enum_registry');
$list = $enumerRegistry->getOriginalList(GenderEnum::class);
echo json_encode($list);// {"MALE":"Male","FEMALE":"Female"}
$listCombine = $enumerRegistry->getCombinedList(GenderEnum::class);
echo json_encode($listCombine); // {"Male":"Male","Female":"Female"}
$normalizedList = $enumerRegistry->getNormalizedList(GenderEnum::class);
echo json_encode($normalizedList); // {"male":"Male","female":"Female"}
$originalValue = $enumerRegistry->getOriginalValue(GenderEnum::class, 'FemALE');
echo $originalValue; // 'Female'
Допустим у нас есть класс из vendor, который содержит константы и нам необходимо его зарегистрировать.
<?php declare(strict_types=1);
namespace Vendor\Acme\Enum;
class VendorGenderEnum
{
const MALE = 'Male';
const FEMALE = 'Female';
}
Чтобы зарегистрировать этот класс необходимо добавить его в массив source_classes
:
wakeapp_enumer:
source_classes:
- Vendor\Acme\Enum\VendorGenderEnum