fast-forward/enum
Composer 安装命令:
composer require fast-forward/enum
包简介
Ergonomic utilities for PHP enums, including names, values, lookups, and option maps.
README 文档
README
Ergonomic utilities and reusable catalogs for PHP enums, including names, values, lookups, maps, sorting helpers, and enum-driven workflows.
✨ Features
- 🧩 Traits for
values(),names(), options, maps, lookups, and enum comparisons - 🧭
Helper\EnumHelperfor generic operations overUnitEnumandBackedEnum - 🔄 Reversible sort-oriented enums such as
SortDirection,NullsPosition, andComparisonResult - 🗂 Reusable catalogs grouped by domain, including
Calendar,Logger,Runtime, andDateTime - 🚦 Enum-based workflow transitions through
StateMachine\HasTransitions - 🏷 Optional
LabeledEnumInterfaceand readable descriptions without framework lock-in - 🧼 Small public API with explicit namespaces and no
Contractsbucket
📦 Installation
composer require fast-forward/enum
Requirements:
- PHP
^8.3
New to the package? Start with the Quickstart, then use the Usage guide when you want more complete examples.
🛠️ Usage
Basic enum ergonomics:
<?php declare(strict_types=1); use FastForward\Enum\Helper\EnumHelper; use FastForward\Enum\Trait\Comparable; use FastForward\Enum\Trait\HasDescription; use FastForward\Enum\Trait\HasNameLookup; use FastForward\Enum\Trait\HasNames; use FastForward\Enum\Trait\HasOptions; use FastForward\Enum\Trait\HasValues; enum Status: string { use Comparable; use HasDescription; use HasNameLookup; use HasNames; use HasOptions; use HasValues; case Draft = 'draft'; case Published = 'published'; } Status::values(); // ['draft', 'published'] Status::names(); // ['Draft', 'Published'] Status::options(); // ['Draft' => 'draft', 'Published' => 'published'] Status::fromName('Draft'); // Status::Draft Status::Draft->is(Status::Published); // false Status::Draft->description(); // 'Draft' EnumHelper::valueMap(Status::class); // ['draft' => Status::Draft, 'published' => Status::Published]
Labels and label maps:
<?php declare(strict_types=1); use FastForward\Enum\Helper\EnumHelper; use FastForward\Enum\LabeledEnumInterface; enum Priority: int implements LabeledEnumInterface { case Low = 1; case High = 2; public function label(): string { return match ($this) { self::Low => 'Low priority', self::High => 'High priority', }; } } EnumHelper::labels(Priority::class); // ['Low priority', 'High priority'] EnumHelper::labelMap(Priority::class); // ['Low' => 'Low priority', 'High' => 'High priority']
Enum-driven workflows:
<?php declare(strict_types=1); use FastForward\Enum\StateMachine\HasTransitions; use FastForward\Enum\StateMachine\InvalidTransitionException; enum ArticleWorkflow: string { use HasTransitions; case Draft = 'draft'; case Reviewing = 'reviewing'; case Published = 'published'; case Archived = 'archived'; protected static function transitionMap(): array { return [ self::Draft->name => [self::Reviewing, self::Archived], self::Reviewing->name => [self::Published, self::Draft], self::Published->name => [self::Archived], self::Archived->name => [], ]; } protected static function initialStateCases(): array { return [self::Draft]; } } ArticleWorkflow::Draft->canTransitionTo(ArticleWorkflow::Reviewing); // true ArticleWorkflow::Archived->isTerminal(); // true ArticleWorkflow::initialStates(); // [ArticleWorkflow::Draft] try { ArticleWorkflow::Reviewing->assertCanTransitionTo(ArticleWorkflow::Archived); } catch (InvalidTransitionException $exception) { // Invalid transition }
Packaged enum catalogs:
<?php declare(strict_types=1); use FastForward\Enum\Calendar\Month; use FastForward\Enum\Calendar\Quarter; use FastForward\Enum\Calendar\Semester; use FastForward\Enum\Calendar\Weekday; use FastForward\Enum\Common\Priority; use FastForward\Enum\Common\Severity; use FastForward\Enum\Comparison\ComparisonOperator; use FastForward\Enum\Container\ServiceLifetime; use FastForward\Enum\DateTime\IntervalUnit; use FastForward\Enum\Event\DispatchMode; use FastForward\Enum\Http\Scheme; use FastForward\Enum\Logger\LogLevel; use FastForward\Enum\Outcome\Result; use FastForward\Enum\Pipeline\FailureMode; use FastForward\Enum\Process\SignalBehavior; use FastForward\Enum\Runtime\Environment; use FastForward\Enum\Sort\CaseSensitivity; use FastForward\Enum\Sort\ComparisonResult; use FastForward\Enum\Sort\NullsPosition; use FastForward\Enum\Sort\SortDirection; Environment::Production->isProduction(); // true Priority::Critical->isHigherThan(Priority::Normal); // true Severity::Error->isAtLeast(Severity::Warning); // true LogLevel::Critical->isAtLeast(LogLevel::Warning); // true Result::Partial->isSuccessful(); // true ComparisonOperator::In->compare('draft', ['draft', 'published']); // true IntervalUnit::Hour->seconds(2); // 7200 DispatchMode::Async->isAsync(); // true ServiceLifetime::Singleton->isReusable(); // true FailureMode::StopOnFailure->stopsOnFailure(); // true Scheme::Https->defaultPort(); // 443 SignalBehavior::Handle->isTerminalControl(); // true Weekday::Saturday->isWeekend(); // true Month::December->quarter(); // 4 Quarter::Q2->months(); // [Month::April, Month::May, Month::June] Semester::H2->quarters(); // [Quarter::Q3, Quarter::Q4] SortDirection::Descending->reverse(); // SortDirection::Ascending NullsPosition::Last->compareNullability(null, 'value'); // 1 CaseSensitivity::Insensitive->equals('Draft', 'draft'); // true ComparisonResult::fromComparisonResult(-1); // ComparisonResult::RightGreater
🧰 API Summary
| API | Description |
|---|---|
Helper\EnumHelper |
Static helpers for cases, names, values, labels, maps, and lookups |
Trait\HasValues |
Adds values() to backed enums |
Trait\HasNames |
Adds names() to any enum |
Trait\HasNameLookup |
Adds fromName(), tryFromName(), and hasName() |
Trait\HasOptions |
Builds option arrays keyed by case name |
Trait\HasNameMap / Trait\HasValueMap |
Builds lookup maps for names and backed values |
Trait\Comparable |
Adds is(), isNot(), in(), and notIn() |
Trait\HasDescription |
Generates readable descriptions from case names |
Trait\HasLabel |
Provides a technical fallback label() implementation |
LabeledEnumInterface |
Contract for enums that expose presentation labels |
DescribedEnumInterface |
Contract for enums that expose human-readable descriptions |
ReversibleInterface |
Common contract for enums exposing reverse() |
StateMachine\HasTransitions |
Adds transition, terminal, and initial-state behavior to workflow enums |
StateMachine\InvalidTransitionException |
Exception thrown by invalid workflow transitions |
🔌 Integration
fast-forward/enum is framework-agnostic and works well in:
- form and UI option generation
- DTO, request, and serializer layers
- validation and name/value normalization
- internal workflow modeling with enum transitions
- logging, sorting, date/time, and runtime catalogs shared across Fast Forward packages
It does not require a container, framework bridge, or reflection-heavy metadata system.
📁 Directory Structure Example
src/
├── Calendar/
├── Common/
├── Comparison/
├── Container/
├── DateTime/
├── Event/
├── Helper/
├── Http/
├── Logger/
├── Outcome/
├── Pipeline/
├── Process/
├── Runtime/
├── Sort/
├── StateMachine/
└── Trait/
tests/
├── Common/
├── Helper/
├── Sort/
├── StateMachine/
├── Support/
└── Trait/
docs/
├── getting-started/
├── usage/
├── api/
└── advanced/
⚙️ Advanced & Customization
- Implement
LabeledEnumInterfacewhen you need explicit presentation labels. - Use your own domain enums when semantics are business-specific rather than generic.
- Combine
Comparable, lookup traits, andHasTransitionsto build compact workflow models. - Prefer the packaged catalogs only when the semantics are stable and cross-project.
🛠️ Versioning & Breaking Changes
The current development line tracks 1.x-dev. There is no published breaking-change history yet for
this package.
❓ FAQ
Q: Why does this package expose traits instead of one giant helper class?
Traits let enums opt into only the ergonomics they need while keeping the public surface explicit.
Q: Why is there no Contracts namespace?
Public interfaces stay in the root namespace so the package does not hide core API behind a generic
bucket.
Q: Is ComparisonResult a PHP polyfill?
No. It is a Fast Forward enum for comparator-style semantics, not a promise of native compatibility.
🛡 License
MIT © 2026 Felipe Sayão Lobato Abreu
🤝 Contributing
Issues, pull requests, and documentation improvements are welcome.
- Read AGENTS.md for repository-specific guidance
- Run
composer dump-autoload - Run
./vendor/bin/dev-tools tests - Update the README and relevant docs when changing public API
🔗 Links
fast-forward/enum 适用场景与选型建议
fast-forward/enum 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 69 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 04 月 24 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「enum」 「fast-forward」 「backed-enum」 「unit-enum」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 fast-forward/enum 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 fast-forward/enum 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 fast-forward/enum 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Enum type behavior for Yii2 based on class constants
A PHP Abstract Enum Class
Compatibility layer for emulating enumerations in PHP < 8.1 and native enumerations in PHP >= 8.1
Enum type behavior and helper for Yii2, for PostgreSQL only
Enum libraries used by Zimbra Api
Bundle for Doctrine enumerations extension for Postgres
统计信息
- 总下载量: 69
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 36
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-04-24
