elriseio/application-layer-bundle
LICENSE file (MIT) at the repo root, with the
contributor copyright line Copyright (c) 2026 Elrise.IO Alexk <[email protected]> (AR-015). Packagist and most open-source
tooling require this file by name (LICENSE, LICENSE.md,
or LICENSE.txt); it ships verbatim alongside composer.json's
license: MIT declaration.composer.json: keywords
(symfony, symfony-bundle, cqrs, ddd, application-layer,
dto, messenger) for faceted search (AR-010).composer.json: homepage (GitHub repo)
and a support block with issues, source, and docs links
(AR-014).composer.json carries version: 1.0.0 removed in favour of git
tags, plus extra.branch-alias.dev-main = 1.x-dev so
composer require elriseio/application-layer-bundle:dev-main
resolves before the first tag is published (AR-014).composer.json scripts block now exposes cs:check
(php-cs-fixer fix --dry-run --diff), test (phpunit), and
check ([[@cs](https://github.com/cs):check, [@test](https://github.com/test)]) alongside the existing cs:fix
(AR-014).CommandHandlerInterface (mutating state)
and QueryHandlerInterface (read-only), each registered through
its own tagged service locator (app_layer.command_handler and
app_layer.query_handler).DataProcessorInterface for DTO-less entry points (projections,
lookup tables, computed reads), registered via the
app_layer.data_processor tag.DtoRequestHandler with two explicit entry points:
dispatchCommand() (runs sanitize → convert → resolve → invoke →
optional queue dispatch) and dispatchQuery() (runs convert →
resolve → invoke; sanitization is skipped because read-side input
is not mutated).DefaultRequestToDtoConverter that extracts the payload from a
Symfony Request (JSON body, or merged query + form) and hands
it to a DtoDeserializerInterface.SymfonyDtoDeserializer with a built-in selfDenormalizer that
handles two DTO shapes without external dependencies:
Symfony\Component\Serializer\Normalizer\ObjectNormalizer;ReflectionClass::newInstanceWithoutConstructor() and writes
fields via reflection.MessengerQueueDispatcher (auto-wired when symfony/messenger
is installed) and NullQueueDispatcher (fallback when it is
not). Both implement DtoQueueDispatcherInterface and are bound
conditionally in AppLayerProcessorExtension.RequestException with a structured details array for
diagnostic context (denormalization failures, handler-resolution
failures, type mismatches).RequestSanitizerInterface (optional, commands only) with a
default no-op RequestSanitizer implementation.RequestHandlerInterface is split into
CommandHandlerInterface and QueryHandlerInterface. Each
carries #[AutoconfigureTag(...)] and is resolved through its
own #[TaggedLocator(...)] on DtoRequestHandler.RequestHandlerTraitMapProviderInterface
and the default DefaultRequestHandlerTraitMapProvider) is
removed. The old RequestHandlerInterface is gone.DataProcessorPass compiler pass is removed in favour of the
#[TaggedLocator('app_layer.data_processor')] attribute on
DataProcessor::__construct().DtoRequestHandler::handle() is replaced by
DtoRequestHandler::dispatchCommand() and
DtoRequestHandler::dispatchQuery(). The two methods are
explicit about which steps of the pipeline they run.ReflectionProperty::setAccessible(true). PHP 8.1+ semantics
allow direct assignment to typed properties regardless of
visibility, so the deprecation warning is gone.CreateOrderHandler,
ListOrdersHandler).RequestHandlerInterface and the trait-map dispatch layer
(RequestHandlerTraitMapProviderInterface,
DefaultRequestHandlerTraitMapProvider).DataProcessorPass compiler pass.ReflectionProperty::setAccessible(true) from the property-only
DTO path.This file follows the Keep a Changelog 1.1.0 format.
How can I help you explore Laravel packages today?