demoniacdeath / enum-bundle
将枚举集成到Symfony框架的库
3.0.0
2020-02-05 11:13 UTC
Requires
- php: ^7.1
- doctrine/common: ^2.4
- doctrine/doctrine-bundle: ^1.2|^2.0
- myclabs/php-enum: ^1.3
- symfony/form: ^3.4|^4.0|^5.0
- symfony/framework-bundle: ^3.4|^4.0|^5.0
- symfony/translation: ^3.4|^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:
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\{{枚举类名}}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
翻译域中查找枚举值的翻译。翻译键的格式为{{配置的表单类型名称}}.{{枚举常量值}}
。因此,按照上面的示例,翻译键将是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;
}
// ...
}
自定义值转换
如果枚举的值不是字符串,可以使用两个魔术函数castValueIn
和castValueOut
来支持非字符串值
<?php namespace App\Enum; use MyCLabs\Enum\Enum; class Status extends Enum { public const SUCCESS = 1; public const ERROR = 2; public static function castValueIn($value) { return (int) $value; } }