Skip to content

Load the helper files through Composer autoload instead of a boot stage #650

Open

Description

@armanist

Summary

Declare the framework's 30 helper files in autoload.files of composer.json, and stop scanning for them in LoadHelpersStage.

Why

  • LoadHelpersStage finds the component helpers on every boot: it scans src/*/Helpers with glob and runs require_once on each file. The root composer.json has no files entry today.
  • The helper files are plain function definitions. They have no constants and no code that runs when the file is included, and only two files have guards (the cron_* functions and the getallheaders polyfill), which is the shape Composer files expects.
  • A static list from Composer replaces about 26 directory scans on every boot, and tools such as PHPStan and IDEs see the functions without booting the application.
  • The packages are to be extracted into separate Composer packages from 4.0, each with its own composer.json and its own helpers. If the helpers are already declared with autoload.files in the monorepo, extraction only moves each package's list into its own composer.json.

Scope

  1. Add the 30 helper files (26 packages: App has 4, Environment has 2, every other package has 1) to autoload.files in composer.json.
  2. Remove the component part of LoadHelpersStage. It keeps loading the application's helpers/ and each module's helpers/, which are the application's own files.
  3. Add a test that fails when a file in src/*/Helpers is not listed in autoload.files, or when a listed file does not exist. Without it, a new helper file that is not added to composer.json shows up only as "undefined function".
  4. Update the documentation that describes helper loading at boot (the App architecture page) when this is released.

Notes

  • The helpers become available as soon as vendor/autoload.php is included, not at boot. They use DS only inside function bodies, so loading earlier is safe.
  • Adding a helper file needs an entry in composer.json and a composer dump-autoload, instead of being picked up by the scan.
  • When a package is later extracted, the paths in its list may change if its folder layout differs from src/<Package>/Helpers/.

Out of scope

  • Extracting any package.
  • Loading the application's and the modules' helpers.
  • Changing what any helper function does.

Acceptance criteria

  • every helper function is available right after vendor/autoload.php, without booting the application
  • the boot no longer scans src/*/Helpers
  • the application's and the modules' helpers still load, in the same order after the framework's
  • the new test fails for an unlisted helper file
  • composer test, composer cs:check, composer phpstan and composer rector:check pass on every PHP version in the CI matrix

Activity

  1. added this to the 3.2.0 milestone on Nov 3, 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

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions