fervo / enum-bundle
一个将枚举集成到Symfony框架的库
3.0.0
2022-10-26 08:47 UTC
Requires
- php: ^7.0|^8.0
- doctrine/common: ^3.0
- doctrine/doctrine-bundle: ^2.0
- doctrine/persistence: ^2.0|^3.0
- myclabs/php-enum: ^1.3
- symfony/form: ^3.0|^4.0|^5.0
- symfony/framework-bundle: ^3.0|^4.0|^5.0
- symfony/translation: ^3.0|^4.0|^5.0
Suggests
- jms/serializer-bundle: If you want to serialize data using JMS Serializer
- sensio/framework-extra-bundle: If you wan to use ParamConverter
- twig/twig: If you want to use enum in your Twig templates
README
为您的Symfony项目提供与Doctrine集成的MyCLabs\Enum。
安装
步骤 1: 下载Bundle
$ composer require fervo/enum-bundle "^2.0"
步骤 2: 启用Bundle
<?php
// app/AppKernel.php
// ...
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
// ...
new Fervo\EnumBundle\FervoEnumBundle(),
);
// ...
}
// ...
}
步骤 3: 配置枚举
fervo_enum:
fqcn_choice_label_prefix: true # For Backward compatibily, should be explicitely set to true
enums:
AppBundle\Enum\Gender:
doctrine_type: gender # Type name used in doctrine annotations
form_type: gender # Used in translation keys
步骤 4: 创建枚举
<?php
namespace AppBundle\Enum\Gender;
use MyCLabs\Enum\Enum;
class Gender extends Enum
{
const MALE = 'male';
const FEMALE = 'female';
}
步骤 5: 在doctrine实体中使用枚举
<?php
namespace AppBundle\Entity;
use AppBundle\Enum\Gender;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
*/
class Person
{
// ...
/**
* @ORM\Column(type="gender")
*/
protected $gender;
// ...
public function getGender()
{
return $this->gender;
}
public function setGender(Gender $gender)
{
$this->gender = $gender;
}
// ...
}
步骤 6: 在Symfony表单中使用枚举
该Bundle自动为每个配置的枚举生成相应的表单类型。表单类型的FQCN格式为FervoEnumBundle\Generated\Form\{{enum class name}}Type
。因此,使用上面的枚举类,可以在以下方式中用作表单类型。
<?php
namespace AppBundle\Form\Type;
use FervoEnumBundle\Generated\Form\GenderType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class EmployeeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('gender', GenderType::class)
// ...
;
}
}
如果表单类型的底层对象是doctrine映射的实体,框架也可以猜测类型。但是,在表单类型中始终指定FQCN是一种好的做法。
或者,您可以使用带配置选项的EnumType
<?php
namespace AppBundle\Form\Type;
use AppBundle\Enum\Gender;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class EmployeeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('gender', EnumType::class, [
'class' => Gender::class,
'choice_label_prefix' => 'gender', // optional
])
// ...
;
}
}
步骤 7: 为枚举值指定翻译
默认情况下,表单类型会在enums
翻译域中查找枚举值的翻译。翻译键的格式为{{configured form_type name}}.{{enum constant value}}
。因此,根据示例,翻译键将是gender.male
和gender.female
。
附加功能
使用枚举与 Symfony @ParamConverter
<?php
namespace AppBundle\Controller;
use AppBundle\Enum\Gender;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class EmployeeController extends Controller
{
/**
* @ParamConverter("gender")
*/
public function indexAction(Gender $gender)
{
// ...
}
}
使用枚举与 JMS\Serializer
<?php
namespace AppBundle\Entity;
use AppBundle\Enum\Gender;
use JMS\Serializer\Annotation as JMS;
class Person
{
// ...
/**
* @JMS\Type("gender")
*/
protected $gender;
// ...
public function getGender()
{
return $this->gender;
}
public function setGender(Gender $gender)
{
$this->gender = $gender;
}
// ...
}