<?php
declare(strict_types=1);
namespace App\Form\Type;
use App\DBAL\Types\AbstractEnumObjectType;
use App\Model\Enum\AbstractEnumObject;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\Loader\CallbackChoiceLoader;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class EnumChoiceType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setRequired('enum_object_class');
$resolver->setAllowedTypes('enum_object_class', 'string');
$resolver->setDefault('choice_label', function (?AbstractEnumObject $choice) {
return $choice ? $choice->readable() : '';
});
$resolver->setDefault('choice_value', function (?AbstractEnumObject $choice) {
return $choice ? $choice->valueOf() : '';
});
$resolver->setDefault('choice_loader', function (Options $options) {
$enumTypeClass = $options['enum_object_class'];
if (!is_subclass_of($enumTypeClass, AbstractEnumObject::class)) {
throw new \LogicException('enum type class must be sub class of '.AbstractEnumObjectType::class);
}
if ($options['choices']) {
$choices = $options['choices'];
} else {
$choices = $enumTypeClass::getInstances();
}
return new CallbackChoiceLoader(function () use ($choices) {
return $choices;
});
});
}
public function getParent()
{
return ChoiceType::class;
}
}