libredte / libredte-lib-core-dispatcher
LibreDTE: Conector (Dispatcher) para exponer la Biblioteca PHP (Core) de forma segura a otros lenguajes.
Package info
github.com/LibreDTE/libredte-lib-core-dispatcher
pkg:composer/libredte/libredte-lib-core-dispatcher
Requires
- php: ^8.5
- derafu/backbone: dev-main
- derafu/backbone-dispatcher: dev-main
- libredte/libredte-lib-core: dev-master
- php-di/invoker: ^2.3
Requires (Dev)
- ext-xdebug: *
- friendsofphp/php-cs-fixer: ^3.95
- phpstan/phpstan: ^2.2
- phpunit/phpunit: ^13.2
This package is auto-updated.
Last update: 2026-08-16 03:27:35 UTC
README
Conector que expone las operaciones de libredte/libredte-lib-core de forma
segura y agnóstica al transporte, usando derafu/backbone-dispatcher
como base. Pensado como la capa intermedia entre LibreDTE y un bridge hacia
otro lenguaje, aunque no depende de ninguno en particular.
Uso
use libredte\lib\CoreDispatcher\Bootstrap; use Derafu\BackboneDispatcher\ValueObject\OperationRequest; $dispatcher = Bootstrap::boot(); // SafeDispatcherInterface $request = new OperationRequest('billing', 'identifier', 'caf_loader', 'load', [ 'xml' => base64_encode($cafXml), ]); $result = $dispatcher->dispatch($request); // Nunca lanza excepciones. if ($result->isSuccess()) { $caf = $result->getValue(); // Ya serializado (array), listo para cruzar // un límite de proceso/lenguaje. } else { $problem = $result->getProblem(); // ProblemDetail (RFC 7807-like). }
Arquitectura
Bootstrap::boot(string $environment = 'prod', bool $debug = false)es el único punto de entrada público. Todo el resto del cableado (Deserializers, la cadenaDirectDispatcher→TypedDispatcher→SafeDispatcherdederafu/backbone-dispatcher) está declarado enconfig/services.yaml, no en PHP.config/services.yamlimporta el delibredte-lib-corey sobreescribelibredte.lib.core.project_dir:kernel.project_dirse resuelve contra el paquete que actúa como punto de entrada, y ese rol lo cumple este paquete, nolibredte-lib-core.Derafu\BackboneDispatcher\Contract\ObjectFactoryInterfaceestá registradolazy: trueporqueDocumentBagDeserializer/SiiRequestDeserializernecesitan ese mismo registro (para deserializar sus campos anidados) y a la vez son entradas de su propio mapa de deserializers — una referencia circular quelazy: truerompe.
Deserializers
Los 9 Deserializers de este paquete cubren únicamente interfaces/tipos de
libredte-lib-core (o de paquetes Derafu genéricos que Core usa):
DocumentBagInterface, XmlDocumentInterface, CafInterface,
CertificateInterface, EmisorInterface, ReceptorInterface,
MandatarioInterface, DocumentEnvelopeInterface, SiiRequestInterface.
Para agregar soporte a una clase nueva:
- Revisar si la clase ya tiene un
fromArray(array $data): selfestático. Si lo tiene, no hace falta escribir nada:FromArrayDeserializer(el$fallbackdel registro) ya la cubre automáticamente, sin registrar nada enservices.yaml. - Si no lo tiene, ver si ya existe una Factory a la que delegar (ver
EmisorDeserializer,ReceptorDeserializer,MandatarioDeserializer). - Si no hay Factory, construir el objeto directamente, delegando los
campos que a su vez son objetos en el
ObjectFactoryInterfaceinyectado (verDocumentBagDeserializer). - Si la construcción no tiene una única forma fija, decidir según qué
claves están presentes (ver
CertificateDeserializer, que elige entreloadFromData()/loadFromKeys()). - Todo Deserializer empieza narrowing su entrada con
assertArray()/assertString()(heredados deAbstract\AbstractDeserializer).
DocumentBag no tiene Deserializer propio para sus campos document y
documentType: siempre reciben null. Agregar los suyos cuando se
necesiten.
Desarrollo
composer install composer tests # PHPUnit con cobertura composer phpstan # Nivel 5 composer phpcs # php-cs-fixer (dry-run)
Términos y condiciones de uso
Licenciado bajo AGPL-3.0+. Disponibles en archivo COPYING