frostiede / enum-bundle
将枚举集成到Symfony框架的库
4.0.0
2021-12-31 12:33 UTC
Requires
- php: ^7.4|^8.0
- ext-json: *
- doctrine/doctrine-bundle: ^1.2|^2.0
- doctrine/orm: ^2.9
- myclabs/php-enum: ^1.3
- symfony/form: ^5.4|^6.0
- symfony/framework-bundle: ^5.4|^6.0
- symfony/translation: ^5.4|^6.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
This package is auto-updated.
Last update: 2024-08-29 05:31:01 UTC
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; } }