mesavolt/named-enum

适用于PHP 7.1+的命名枚举

v0.8.4 2023-04-25 14:06 UTC

README

Latest Stable Version Build Status Coverage Status License

用法

将包添加到您的项目中

composer require mesavolt/named-enum

定义一个扩展 Mesavolt\Enum\NamedEnum 的类,包含您的枚举值和名称。值应定义为类常量(其可见性由您决定),名称应声明在受保护的静态类变量 $VALUE_NAMES 中,索引为相应的值。

快速说明:默认情况下,NamedEnum::getName($value) 会静默忽略未定义的值,并返回 null。您可以通过扩展 Mesavolt\Enum\StrictNamedEnum 来进行严格检查,如果向 getName($value) 传递未定义的枚举值,则会抛出 \InvalidArgumentException

<?php

namespace App;


use Mesavolt\Enum\NamedEnum;

abstract class MyEnum extends NamedEnum
{
    public const FOO = 'foo';
    public const BAR = 'bar';
    
    protected static $VALUE_NAMES = [
        self::FOO => 'Foo name',
        self::BAR => 'Bar name',
    ];
}

在您的项目中使用它

<?php

use App\MyEnum;

$object = new stdClass();
$object->foo = MyEnum::BAR;

echo MyEnum::getName($object->foo); // Bar name

查看 NamedEnum 的公共方法 以获取更多用法示例。

集成

Symfony >=3 与 Twig >1.26

如果您使用的是 Symfony 3.3 中引入的默认 自动配置功能,则只需在您的 services.yml 文件中将 Mesavolt\Twig\NamedEnumExtension 注册为服务即可。Symfony 将将其正确标记以注册到您的应用程序使用的 twig 环境。

如果您不使用自动配置功能或它不可用,则在将扩展注册为服务时需要手动应用标签。

# Symfony 3: app/config/services.yml
# Symfony 4: config/services.yaml
services:

    # Use this if you use the default auto-configuring feature of Symfony >=3.3  DI container
    Mesavolt\Twig\NamedEnumExtension: ~

    # Use this if you **don't** use the auto-configuring feature of Symfony >=3.3 DI container
    app.named_enum_extension:
        class: Mesavolt\Twig\NamedEnumExtension
        tags: { name: twig.extension }

然后,您可以在模板中使用扩展提供的 enum_name 过滤器和 enum_name 函数

<?php
// src/Controller/HomeController.php
// This is an example for Symfony 4.
// The code is exactly the same for Symfony 3, only the file locations change.
namespace App\Controller;


use App\Enum;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HomeController extends Controller
{
    public function index()
    {
        return $this->render('my-template.html.twig', [
            'value1' => Enum::FOO,
            'value2' => Enum::BAR
        ]);
    }
}
{# templates/my-template.html.twig #}

You selected "{{ value1|enum_name('\\App\\MyEnum') }}"
{# You selected "Foo name" #}


You selected {"{ enum_name(value2, '\\App\\MyEnum') }}"
{# You selected "Bar name" #}

测试

composer dump-autoload # make sure vendor/autoload.php exists
./vendor/bin/phpunit