fervo/enum-bundle

一个将枚举集成到Symfony框架的库

安装量: 87,604

依赖者: 0

建议者: 0

安全: 0

星标: 11

关注者: 4

分支: 11

公开问题: 5

类型:symfony-bundle

3.0.0 2022-10-26 08:47 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:
    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.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;
    }

    // ...
}