fangx/php-enum

php enum generator

v2.0.0 2021-08-17 08:05 UTC

This package is auto-updated.

Last update: 2024-04-17 14:22:25 UTC


README

Install

Via Composer

composer require fangx/php-enum

Usage

使用 ./vendor/bin/enum 命令创建一个枚举类.

./vendor/bin/enum FooEnum --enum="1=foo" --enum="b=bar" --path=Enums

该命令默认在 当前目录的 Enums 目录下创建一个 FooEnum.php 文件. 文件内容如下:

<?php
namespace Enums;

use Fangx\Enum\AbstractEnum;

class FooEnum extends AbstractEnum
{
    const FOO = "f", __FOO = "foo";
    const BAR = "b", __BAR = "bar";
}

枚举类默认继承 \Fangx\Enum\AbstractEnum. 可以静态调用以下方法:

  • toArray(Format $format = null, Filter $filter = null)
  • toJson(Format $format = null, Filter $filter = null)
  • desc($key, $default = 'Undefined')

获取所有的枚举值

<?php

class FooEnum extends \Fangx\Enum\AbstractEnum
{
    const FOO = 'f', __FOO = 'foo';
    const BAR = 'b', __BAR = 'bar';
}

/**
 * ['f' => 'foo', 'b' => 'bar']
 */
FooEnum::toArray();

获取枚举值的描述信息

<?php

class FooEnum extends \Fangx\Enum\AbstractEnum
{
    const FOO = 'f', __FOO = 'foo';
    const BAR = 'b', __BAR = 'bar';
}

/**
 * "foo"
 */
FooEnum::desc('f');

/**
 * "bar"
 */
FooEnum::desc('b');

使用格式来约束返回值

<?php
class FooFormat implements \Fangx\Enum\Contracts\Format
{
    public function parse(\Fangx\Enum\Contracts\Definition $definition): array
    {
        return [['key' => $definition->getKey() , 'value' => $definition->getValue()]];
    }
}

class FooEnum extends \Fangx\Enum\AbstractEnum
{
    const FOO = 'f', __FOO = 'foo';
    const BAR = 'b', __BAR = 'bar';
}

/**
 * [['key' => 'f', 'value' => 'foo'], ['key' => 'b', 'value' => 'bar'],]
 */
$format = new FooFormat();
FooEnum::toArray($format);

通过规则来过来过滤枚举值. 当 __invoke 返回 true 时, 该值将会在结果中被剔除

支持设置多个过滤规则, FooEnum::toArray(null, $filter1, $filter2, $filter3);

class FooFilter implements \Fangx\Enum\Contracts\Filter
{
    public function __invoke(\Fangx\Enum\Contracts\Definition $definition)
    {
        return $definition->getKey() !== 'f';
    }
}

/**
 * ['f' => 'foo']
 */
$fooFilter = new FooFilter();
$barFilter = new BarFilter();
FooEnum::toArray(null, $fooFilter, $barFilter);
FooEnum::addFilter($fooFilter)->addFilter($barFilter)->toArray(); # ^1.3

使用自定义的集合来作为所有的枚举类型, 其他使用方法与 FooEnum 一致.

<?php
class BarEnum extends \Fangx\Enum\AbstractEnum
{
    public function all()
    {
        return [
            new \Fangx\Enum\Definition('f', 'foo'),
            new \Fangx\Enum\Definition('b', 'bar'),
        ];
    }
}

v1.2 起, 支持设置默认的 filtersformat

设置默认的过滤器

<?php
declare(strict_types=1);

namespace Fangx\Tests\Stubs;

use Fangx\Enum\WithoutDefault;

class HasDefaultFiltersEnum extends ExampleEnum
{
    public function filters()
    {
        return [
            new WithoutDefault(),
            new WithoutDefault('unknown'),
        ];
    }
}

设置默认的格式

<?php
declare(strict_types=1);

namespace Fangx\Tests\Stubs;

use Fangx\Enum\Contracts\Format;

class HasDefaultFormatEnum extends ExampleEnum
{
    public function format(): ?Format
    {
        return new CustomFormat();
    }
}

Test

composer test