doctrineum / scalar
为 Doctrine 设计的枚举类型和值相关子类型
4.0.0
2019-02-13 08:42 UTC
Requires
- php: >=7.1
- doctrine/dbal: ~2.4
- doctrineum/self-registering-type: ~2.1
- granam/scalar-enum: ~1.0
- granam/tools: ^3.0
Requires (Dev)
- granam/exceptions-hierarchy: ~4.0
- mockery/mockery: ~1.0
- phpunit/phpunit: ~7.0
- roave/security-advisories: dev-master
README
适用于 Doctrine 2.4+ 的可定制枚举类型
有关自定义 Doctrine 类型,请参阅官方文档。有关默认类型,请参阅官方文档。
用法
安装
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 异常层次结构思想。这意味着每个可抛出状态可能是由 逻辑 错误而不是运行时情况引起的。