frostiede/enum-bundle

将枚举集成到Symfony框架的库

安装次数: 1,161

依赖者: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 11

类型:symfony-bundle

4.0.0 2021-12-31 12:33 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.malegender.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;
    }

    // ...
}

自定义值转换

如果枚举的值不是字符串,您可以使用两个魔术函数castValueIncastValueOut来支持非字符串值

<?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;
    }
}