doctrineum/scalar

为 Doctrine 设计的枚举类型和值相关子类型

4.0.0 2019-02-13 08:42 UTC

README

Build Status Test Coverage Latest Stable Version License

适用于 Doctrine 2.4+ 的可定制枚举类型

有关自定义 Doctrine 类型,请参阅官方文档。有关默认类型,请参阅官方文档

用法

  1. 安装
  2. 自定义类型注册
  3. 将属性映射为枚举
  4. 创建枚举
  5. 注册子类型枚举
  6. NULL 是 NULL,不是 Enum
  7. 了解基础知识
  8. 异常哲学

安装

composer.phar require doctrineum/scalar

或者手动编辑项目中的 composer.json 文件和 "require": 块(扩展现有内容)

    "require": {
        "doctrineum/scalar": "dev-master"
    }

自定义类型注册

通过辅助方法

ScalarEnum::registerSelf(); // quick self-registration

或者手动使用 "magic" class::class 常量

use Doctrineum\Scalar\ScalarEnumType;
// ...
Type::addType(ScalarEnumType::getTypeName(), ScalarEnumType::class);
Type::addType(BarScalarEnumType::getTypeName(), BarScalarEnumType::class);

或者手动以传统方式

<?php
// in bootstrapping code
// ...
use Doctrine\DBAL\Types\Type;
use Doctrineum\Scalar\ScalarEnumType;
// ...
// Register type
Type::addType(ScalarEnumType::getTypeName(), '\Doctrineum\ScalarEnumType');
Type::addType(BarScalarEnumType::getTypeName(), '\Foo\BarScalarEnumType');

或者如果你的项目使用 Symfony2

# app/config/config.yml
doctrine:
    dbal:
        # ...
        types:
            scalar_enum: Doctrineum\Scalar\ScalarEnumType
            bar: Foo\BarScalarEnumType
            #...

将属性映射为枚举

<?php
class Foo
{
    /** @Column(type="scalar_enum") */
    protected $field;
}

创建枚举

<?php
use Doctrineum\Scalar\ScalarEnum;
$enum = ScalarEnum::getEnum('foo bar');

注册子类型枚举

你可以注册无限数量的枚举,这些枚举根据你选择的正则表达式构建。

<?php
use Doctrineum\Scalar\ScalarEnumType;
ScalarEnumType::addSubTypeEnum('\Foo\Bar\YourSubTypeEnum', '~get me different enum for this value~');
// ...
$enum = $ScalarEnumType->convertToPHPValue('foo');
get_class($enum) === '\Doctrineum\Scalar\ScalarEnum'; // true
get_class($enum) === '\Foo\Bar\YourSubTypeEnum'; // false
$byRegexpDeterminedEnum = $ScalarEnumType->convertToPHPValue('And now get me different enum for this value.');
get_class($byRegexpDeterminedEnum) === '\Foo\Bar\YourSubTypeEnum'; // true

NULL 是 NULL,枚举不能包含它

你不能使用 NULL 值创建 ScalarEnum。只需直接使用 NULL 这样的列值。

请注意,仅在主枚举是一个抽象类时使用子类型。你必须解决从数据库 NULL 到 PHP 值的转换,或者显式为 NULL 值(空字符串)注册子类型,否则在创建抽象类实例时会发生致命错误。

了解基础知识

有两种角色 - 工厂和值。

  • ScalarEnumType 是工厂(作为 Doctrine\DBAL\Types\Type 家族的一部分),根据 ScalarEnumType 规则构建 ScalarEnum。
  • ScalarEnum 是值持有者,实际上是单例,由一个类表示。众所周知,类可以做很多事,这使得枚举比整个标量值更有吸引力。
  • 子类型是 ScalarEnumType,但不仅受类型约束,还受当前值的约束。一种类型可以有任意数量的子类型,这取决于你的想象力和使用的枚举值。
异常哲学

Doctrineum 采用 Granam 异常层次结构思想。这意味着每个可抛出状态可能是由 逻辑 错误而不是运行时情况引起的。