From 70a418bc1c1904790f22aa0b0e3332725df9817a Mon Sep 17 00:00:00 2001 From: Jelle van Oosterbosch Date: Sun, 30 Aug 2026 19:54:38 +0200 Subject: [PATCH 1/3] Add a changelog Release notes on GitHub list PR titles, which do not say what an upgrade requires. The 0.12.1 entry records the two changes that can affect an existing application: duplicate command route names now fail the container build, and NelmioApiDocBundle must be configured rather than merely installed. Also records why 0.12.3 exists: it is the same commit as 0.12.2, re-released because Packagist could not correct the mis-tagged 0.12.2 in place. --- CHANGELOG.md | 219 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 220 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ba1450c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,219 @@ +# Changelog + +All notable changes to this project are documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). While the version is below `1.0.0`, minor releases +may contain breaking changes; read the **Upgrading** notes before bumping a minor. + +## [Unreleased] + +## [0.12.3] - 2026-08-30 + +Identical in content to `0.12.2` — same commit, no code difference. `0.12.2` was published to Packagist from a +mis-tagged commit and could not be corrected in place, because Packagist will not re-point an existing version +at a different commit. `0.12.3` re-releases the same code under a fresh number. If you are on `0.12.2` from +GitHub you already have this code; Composer users should take `0.12.3`. + +## [0.12.2] - 2026-08-30 + +Available as a git tag and GitHub release only — see `0.12.3` above. + +### Fixed + +- `NelmioAreaRoutesChecker` no longer stops checking areas when a route locator entry is not a + `RouteCollection`. It previously abandoned every remaining area, so routes in later areas could be treated + as non-API — silently skipping request validation and RFC 7807 error responses for them. + +## [0.12.1] - 2026-08-30 + +### Added + +- `command_paths` configuration key listing the directories scanned for command DTOs. Defaults to + `['%kernel.project_dir%/src']`, matching the path that was previously hardcoded. Set it to `[]` to disable + discovery and declare command routes explicitly. +- `CommandRouteDirectoryLoader` is now registered as a service, so + `type: stixx_openapi_command.command_attributes` can be used to import a directory of commands from an + application's routing configuration. + +### Changed + +- **Two command classes resolving to the same route name now fail the container build**, naming both classes. + Previously one silently overwrote the other and lost its endpoint. See **Upgrading** below. +- An unconfigured `NelmioApiDocBundle` now fails with an actionable message naming the missing half of the + setup — the `config/bundles.php` entry or the package configuration — instead of an opaque + "service does not exist" error for `stixx_openapi_command.nelmio.routes_locator`. + +### Fixed + +- Command routes are registered regardless of how the application declares its own routes. Discovery + previously hung off a decorator on `routing.loader.attribute.directory`, so it only ran if the application + happened to load routes through that loader. Applications using the current Symfony skeleton's + `config/routes.yaml` — which sets a `namespace` and therefore loads via `Psr4DirectoryLoader` — got no + command routes at all, with no error to explain why. +- Discovered command routes now carry their cache resources, so adding or editing a command DTO invalidates + the router cache. Previously the routes went stale in `debug` mode until a manual `cache:clear`. +- Route priorities are preserved when discovered routes are added to the application's collection. + +### Removed + +- `AttributeDirectoryLoaderDecorator`, replaced by `RouterLoaderDecorator` and `CommandRouteDiscovery`. It was + marked `@internal`, as all route loaders are. + +### Upgrading + +If two of your command classes resolve to the same route name, the container will now fail to compile instead +of silently dropping one endpoint. Without an `operationId` the name is derived from the class short name, so +`Billing\CreateInvoiceCommand` and `Sales\CreateInvoiceCommand` both resolve to `command_createinvoicecommand`. +The error names both classes; give at least one an explicit `operationId`. A build that goes red here was +already losing an endpoint silently before the upgrade. + +`NelmioApiDocBundle` must be registered in `config/bundles.php` **and** configured with at least one area. +Installing it with Composer is not enough. See the README's installation section. + +## [0.12.0] - 2026-07-11 + +### Added + +- Configurable `Cache-Control` header on command responses via the `cache_control` key. + +## [0.11.2] - 2026-06-15 + +### Fixed + +- Command routes are ordered most-specific-first, so literal paths win over placeholder paths. + +## [0.11.1] - 2026-05-22 + +### Fixed + +- String query and route scalars are coerced against constructor scalar types. +- CI: disabled `composer audit` block-insecure so the dependency solver resolves. + +## [0.11.0] - 2026-05-10 + +### Changed + +- Updated the request-lifecycle diagram in the documentation. + +## [0.10.0] - 2026-05-09 + +### Changed + +- Classes reshaped to surface the public (`@api`) and internal (`@internal`) contracts. +- Expanded bundle documentation. + +## [0.9.0] - 2026-05-09 + +### Changed + +- Centralized unwrapping of Messenger exceptions. + +## [0.8.0] - 2026-05-09 + +### Added + +- `problem+json` responses for unmatched paths and wrong HTTP verbs under API areas. + +## [0.7.0] - 2026-05-09 + +### Changed + +- Audit fixes and tactical polish. + +## [0.6.0] - 2026-05-09 + +### Added + +- CI coverage for PHP 8.5 and Symfony 8. + +### Changed + +- `RequestValidator` is cached and `ApiExceptionSubscriber` is exception-safe. + +## [0.5.4] - 2026-05-08 + +### Added + +- Symfony Validator constraint violations map to HTTP 422 following RFC 7807. + +## [0.5.3] - 2026-04-11 + +### Fixed + +- `HandlerFailedException` is unwrapped, and `AccessDeniedException` is caught. + +## [0.5.2] - 2026-03-02 + +### Changed + +- `ApiExceptionSubscriber` is less aggressive about which exceptions it handles. + +## [0.5.1] - 2026-03-01 + +### Added + +- Project documentation. + +## [0.5.0] - 2026-03-01 + +### Added + +- Bundle configuration to include `ProblemDetails` in the generated OpenAPI schema automatically. + +## [0.4.0] - 2026-03-01 + +### Added + +- Functional test suite. +- CodeRabbit configuration. + +## [0.3.0] - 2026-01-25 + +### Added + +- Test coverage for the bundle's classes. + +## [0.2.1] - 2025-12-12 + +### Fixed + +- `JsonSerializedResponder` handles arrays and iterables. + +## [0.2.0] - 2025-12-12 + +### Added + +- Responder layer in `CommandController`, aligning with the ADR pattern. + +## [0.1.0] - 2025-12-11 + +### Added + +- Initial release: bundle, service and `CommandController` configuration, `ApiProblemNormalizer` that strips + details outside debug mode, and a `CommandValueResolver` that supports list endpoints and the combination of + parameters with a request body. + +[Unreleased]: https://github.com/stixx/openapi-command-bundle/compare/0.12.3...HEAD +[0.12.3]: https://github.com/stixx/openapi-command-bundle/compare/0.12.1...0.12.3 +[0.12.2]: https://github.com/stixx/openapi-command-bundle/compare/0.12.1...0.12.2 +[0.12.1]: https://github.com/stixx/openapi-command-bundle/compare/0.12.0...0.12.1 +[0.12.0]: https://github.com/stixx/openapi-command-bundle/compare/0.11.2...0.12.0 +[0.11.2]: https://github.com/stixx/openapi-command-bundle/compare/0.11.1...0.11.2 +[0.11.1]: https://github.com/stixx/openapi-command-bundle/compare/0.11.0...0.11.1 +[0.11.0]: https://github.com/stixx/openapi-command-bundle/compare/0.10.0...0.11.0 +[0.10.0]: https://github.com/stixx/openapi-command-bundle/compare/0.9.0...0.10.0 +[0.9.0]: https://github.com/stixx/openapi-command-bundle/compare/0.8.0...0.9.0 +[0.8.0]: https://github.com/stixx/openapi-command-bundle/compare/0.7.0...0.8.0 +[0.7.0]: https://github.com/stixx/openapi-command-bundle/compare/0.6.0...0.7.0 +[0.6.0]: https://github.com/stixx/openapi-command-bundle/compare/0.5.4...0.6.0 +[0.5.4]: https://github.com/stixx/openapi-command-bundle/compare/0.5.3...0.5.4 +[0.5.3]: https://github.com/stixx/openapi-command-bundle/compare/0.5.2...0.5.3 +[0.5.2]: https://github.com/stixx/openapi-command-bundle/compare/0.5.1...0.5.2 +[0.5.1]: https://github.com/stixx/openapi-command-bundle/compare/0.5.0...0.5.1 +[0.5.0]: https://github.com/stixx/openapi-command-bundle/compare/0.4.0...0.5.0 +[0.4.0]: https://github.com/stixx/openapi-command-bundle/compare/0.3.0...0.4.0 +[0.3.0]: https://github.com/stixx/openapi-command-bundle/compare/0.2.1...0.3.0 +[0.2.1]: https://github.com/stixx/openapi-command-bundle/compare/0.2.0...0.2.1 +[0.2.0]: https://github.com/stixx/openapi-command-bundle/compare/0.1.0...0.2.0 +[0.1.0]: https://github.com/stixx/openapi-command-bundle/releases/tag/0.1.0 diff --git a/README.md b/README.md index 64e27d2..0a6f739 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,7 @@ stixx_openapi_command: For more detailed information, please refer to the following documentation: +- [Changelog](CHANGELOG.md) — release history and upgrade notes - [Command Routing & Request Handling](docs/command-routing.md) - [Validation & Error Handling](docs/validation.md) - [OpenAPI Integration](docs/openapi.md) From 6c3dbf60d68f3029171d0ff4b43c38f82daf75f2 Mon Sep 17 00:00:00 2001 From: Jelle van Oosterbosch Date: Sun, 30 Aug 2026 19:58:44 +0200 Subject: [PATCH 2/3] Address review feedback on the changelog Compare 0.12.3 against 0.12.2, the version it follows in this file. That link is empty because both tags point at the same commit, so the entry now says so and points at 0.12.1...0.12.3 for the delta a Packagist user actually receives. Record the changelog itself under Unreleased: merging it does not warrant a release on its own, and the section carries it until one is due. --- CHANGELOG.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba1450c..680363b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ may contain breaking changes; read the **Upgrading** notes before bumping a mino ## [Unreleased] +### Added + +- This changelog. + ## [0.12.3] - 2026-08-30 Identical in content to `0.12.2` — same commit, no code difference. `0.12.2` was published to Packagist from a @@ -15,6 +19,11 @@ mis-tagged commit and could not be corrected in place, because Packagist will no at a different commit. `0.12.3` re-releases the same code under a fresh number. If you are on `0.12.2` from GitHub you already have this code; Composer users should take `0.12.3`. +The `0.12.2...0.12.3` comparison below is empty, as the two tags point at the same commit. Coming from +Packagist, where `0.12.2` does not exist, the changes you are picking up are those in +[`0.12.1...0.12.3`](https://github.com/stixx/openapi-command-bundle/compare/0.12.1...0.12.3) — the `0.12.2` +entry below. + ## [0.12.2] - 2026-08-30 Available as a git tag and GitHub release only — see `0.12.3` above. @@ -195,7 +204,7 @@ Installing it with Composer is not enough. See the README's installation section parameters with a request body. [Unreleased]: https://github.com/stixx/openapi-command-bundle/compare/0.12.3...HEAD -[0.12.3]: https://github.com/stixx/openapi-command-bundle/compare/0.12.1...0.12.3 +[0.12.3]: https://github.com/stixx/openapi-command-bundle/compare/0.12.2...0.12.3 [0.12.2]: https://github.com/stixx/openapi-command-bundle/compare/0.12.1...0.12.2 [0.12.1]: https://github.com/stixx/openapi-command-bundle/compare/0.12.0...0.12.1 [0.12.0]: https://github.com/stixx/openapi-command-bundle/compare/0.11.2...0.12.0 From b24db61c09fb205d0f956697e3445ef361c741a6 Mon Sep 17 00:00:00 2001 From: Jelle van Oosterbosch Date: Sun, 30 Aug 2026 20:03:03 +0200 Subject: [PATCH 3/3] Release the changelog as 0.12.4 Tags up to 0.12.3 predate this file, and there is no .gitattributes, so the changelog only reaches consumers once it is inside a tagged archive. Promote the Unreleased entry to 0.12.4 so it can be tagged on merge. --- CHANGELOG.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 680363b..197745d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,14 @@ may contain breaking changes; read the **Upgrading** notes before bumping a mino ## [Unreleased] +## [0.12.4] - 2026-08-30 + +Documentation only — no code changes since `0.12.3`. + ### Added -- This changelog. +- This changelog. Released so that it ships with the package rather than only appearing on the default + branch; `0.12.3` and earlier tags do not contain it. ## [0.12.3] - 2026-08-30 @@ -203,7 +208,8 @@ Installing it with Composer is not enough. See the README's installation section details outside debug mode, and a `CommandValueResolver` that supports list endpoints and the combination of parameters with a request body. -[Unreleased]: https://github.com/stixx/openapi-command-bundle/compare/0.12.3...HEAD +[Unreleased]: https://github.com/stixx/openapi-command-bundle/compare/0.12.4...HEAD +[0.12.4]: https://github.com/stixx/openapi-command-bundle/compare/0.12.3...0.12.4 [0.12.3]: https://github.com/stixx/openapi-command-bundle/compare/0.12.2...0.12.3 [0.12.2]: https://github.com/stixx/openapi-command-bundle/compare/0.12.1...0.12.2 [0.12.1]: https://github.com/stixx/openapi-command-bundle/compare/0.12.0...0.12.1