Skip to content

Convert the adapter types and the remaining Enums classes to PHP enums (PHP 8.2) #620

Open

Description

@armanist

Summary

Convert the remaining classes in the Enums folders to PHP enums in 3.2.0, once PHP 8.2 is the minimum: the adapter types, StatusCode, ContentType, Env and ExitCode. The first batch, the classes that can convert on PHP 8.1, is #612.

Why 3.2.0

These classes appear in class constants, property defaults or parameter defaults, mostly as the keys of maps, and PHP 8.1 does not allow Case->value in a constant expression. PHP 8.2 does (the RFC "Fetch properties of enums in const expressions"). I checked it on PHP 8.2.35 and 8.1.34:

  • public const ADAPTERS = [LoggerType::SINGLE->value => SingleAdapter::class, ...] loads and works on 8.2.
  • The same code fails on 8.1 with Fatal error: Constant expression contains invalid operations, and so does the real LoggerFactory.php with its keys written that way.

With 8.2 the maps keep their shape. In each place only ->value is added to the keys.

Classes in this ticket

  • Adapter types (15): AppType, ArchiveType, AuthType, CacheType, CaptchaType, CryptorType, DatabaseType, FileSystemType, LangType, LoggerType, MailerType, PaginatorType, RateLimitType, RendererType, SessionType.
  • Others: ContentType, Env, ExitCode, StatusCode (62 integer cases).

Places that need ->value

  • the 15 ADAPTERS constants in the factories and Database
  • PaginatorFactory::REQUIRED_PARAMS
  • the Status trait's $texts map, with the status codes as keys
  • the property and parameter defaults that hold these classes

What to watch

  • An enum case is not its value: StatusCode::OK === 200 is false, and an int parameter rejects a case. Comparisons, array keys and parameters that use the value need ->value, and text from config or .env needs ::from() or ::tryFrom().
  • Apps and templates use these constants, for example AppFactory::create(AppType::WEB, ...) in the starter project and PaginatorType in the Toolkit templates. Signatures typed string $type change.

Out of scope

Breaking changes

  • Public constants become enum cases, and the type of some public parameters and return values changes. To be listed in the changelog and in the upgrade guide.

Acceptance criteria

  • every class above is converted or has a recorded reason to stay a constants class
  • the starter project and the module templates still work, and the docs examples use the new form
  • composer test, composer cs:check, composer phpstan and composer rector:check pass on every PHP version in the CI matrix
  • the changelog lists every converted class

Activity

  1. added this to the 3.2.0 milestone on Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions