Skip to content

Release 1.47.0 — Hadar: Extension System Re-Architecture

Choose a tag to compare

@MichaelSowah MichaelSowah released this 30 May 08:00
· 171 commits to main since this release
58f35a9

Release 1.47.0 — Hadar

Theme: Extension System Re-Architecture. Composer-only discovery + a single
enabled allow-list + a pure resolver (select → validate → topo-order). Replaces
the 4-source ProviderLocator model, the multi-key config files, and the
dev↔prod parity hazard (live-resolve dev / lazy-cache prod).

Highlights

  • New units: ExtensionCandidate, ExtensionResolver (+ ResolverResult/ResolverError),
    AppProviderLoader, ExtensionStateWriter, ProviderClassResolver, EnabledProviders;
    PackageManifest::getCandidates() (reads installed.json for extra.glueful). Adds composer/semver.
  • One resolution path: ExtensionManager + ContainerFactory both resolve via the shared
    ProviderClassResolver. Strict production cache (fail-if-missing); development resolves live.
  • CLI: enable/disable validate before writing + recompile; strict cache; stateful list
    (folds in why, case-insensitive slug); info/diagnose on the new model; create:extension
    scaffolds a Composer package + path repo. Removes ProviderLocator, local-folder scan,
    runtime PSR-4 registration, extensions:why.
  • Config: config/extensions.php + config/serviceproviders.php → single enabled string-FQCN list.
  • Docs: docs/EXTENSIONS_UPGRADE.md; CHANGELOG / ROADMAP / Version bumped to 1.47.0.

⚠️ Breaking (config format) — shipped as a minor per the pre-public policy

  • Convert both config files to the single enabled list of plain string FQCNs (no ::class).
    Old keys map per docs/EXTENSIONS_UPGRADE.md (onlyenabled, disabled→omit,
    dev_onlyenabled+require-dev, local_path→Composer path repo, scan_composer→removed).
  • Run composer update (new composer/semver dep). Production must run php glueful extensions:cache.

Tests

Full suite green — 954 passing; PHPStan level 6 [OK] on src; phpcs clean. New coverage:
ExtensionResolverTest, PackageManifestCandidatesTest, AppProviderLoaderTest,
ExtensionStateWriterTest, ProviderClassResolverTest, EnabledProvidersTest,
ExtensionManagerResolveTest, ExtensionCliTest, CreateExtensionTest.