demoniacdeath/enum-bundle

将枚举集成到Symfony框架的库

安装: 16

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 11

类型:symfony-bundle

3.0.0 2020-02-05 11:13 UTC

This package is auto-updated.

Last update: 2024-09-21 13:29:16 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;
    }
}