Ein Package
benjaminoeffinger/nexum ist die gemeinsame Installationsgrenze.
DOKUMENTATION
Ein Package, ein Symfony-Bundle und klare organisatorische Grenzen für Modules, Projects, Multi-Domain-Routing und optionale Infrastruktur.
01 Überblick
Nexum ist eine modulare Architektur-Erweiterung für moderne Symfony-Anwendungen ab Version 7.4. Es wird als ein Composer-Package betrieben und verbindet automatische Discovery, validierte Modules, optionale Projects sowie direkt nutzbare Infrastruktur. Diese Grenzen sind keine Microservices und werden nicht separat deployt.
benjaminoeffinger/nexum ist die gemeinsame Installationsgrenze.
NexumBundle ist der einzige Symfony-Integrationspunkt.
Discovery und Validierung stoppen ungültige Abhängigkeitsgraphen beim Build.
02 Installation
Installiere Nexum in einer Symfony-Anwendung ab Version 7.4. Die Symfony-Flex-Recipe ist vorbereitet; bis zu ihrer Veröffentlichung werden ein Bundle, sichere Standardkonfiguration und ein Routenimport einmalig manuell ergänzt.
composer require benjaminoeffinger/nexumNexum\NexumBundle::class => ['all' => true],nexum:
resource: .
type: nexumnexum:
doctrine: { enabled: false }
api: { enabled: false }
security: { enabled: false }Bis die externe Symfony-Flex-Recipe veröffentlicht ist, werden Bundle, zentrale Konfiguration und Routenimport einmalig manuell ergänzt.
03 Erstes Modul
Ein Modul ist eine normale PHP-Klasse mit dem Attribut #[NexumModule]. Es gibt keinen Generatorbefehl und keine Bundle-Registrierung pro Modul.
<?php
namespace App\Module\Billing;
use Nexum\Module\Attribute\NexumModule;
#[NexumModule(description: 'Billing domain')]
final class BillingModule
{
}Services, Controller, Commands, Event Subscriber und Messenger Handler innerhalb des Modulordners verwenden normales Symfony-Autowiring und Autoconfiguration. Entity/, Dto/ und der Descriptor selbst werden nicht als Services registriert.
Class-Strings sind die technische Identität. Die lesbare ID wird aus dem Klassennamen abgeleitet und kann als lowercase kebab-case überschrieben werden.
dependencies: [UserModule::class] beschreibt den Graphen. Transitive Abhängigkeiten ergänzt Nexum automatisch.
Descriptor-, Modul- und Controllerdateien werden als Symfony-Ressourcen registriert und invalidieren im Development die zuständigen Caches.
04 Modules & Projects
Alle gefundenen und nicht deaktivierten Shared Modules sind aktiv. Klassische Symfony-Controller und Routen bleiben unverändert nutzbar.
Project-Descriptoren ordnen Shared und private Modules Bereichen wie Storefront, Admin oder API zu und präfixieren deren Routen.
use App\Module\Catalog\CatalogModule;
use App\Module\User\UserModule;
use Nexum\Project\Attribute\NexumProject;
#[NexumProject(
modules: [CatalogModule::class, UserModule::class],
)]
final class StorefrontProject
{
}DISCOVERY
src/Module/*src/Project/*/Module/*nexum.projects.*.hostsTransitive Abhängigkeiten ergänzt Nexum beim Kompilieren automatisch.
Die Zuordnung steuert Routen und sichtbare Module, aber nicht automatisch Services, Datenbanktabellen, Tokens, Subscriber oder Handler.
nexum:
projects:
storefront:
hosts: [shop.example.com, www.example.com]
admin:
hosts: [admin.example.com]Bei genau einem Project sind Hosts optional. Bei mehreren Projects benötigt jedes Project mindestens einen eindeutigen exakten Host. Der erste Eintrag ist der Canonical Host; Wildcards, Pfadpräfixe und Tenant-Subdomains werden derzeit nicht automatisch aufgelöst.
05 Konfiguration
Die gesamte Konfiguration liegt unter nexum:. Discovery verwendet standardmäßig %kernel.project_dir%/src und ermittelt den passenden Namespace aus Composer. Nur bei mehrdeutigen PSR-4-Mappings ist ein Namespace-Override nötig.
nexum:
discovery:
root: '%kernel.project_dir%/src'
modules:
legacy: { enabled: false }
doctrine: { enabled: true }
api: { enabled: false }
filesystem:
enabled: true
root: '%kernel.project_dir%/storage/files'
messenger: { enabled: true }Ein aktiver Graph darf kein deaktiviertes Modul benötigen. Nexum deaktiviert abhängige Module nicht stillschweigend, sondern beendet den Container-Build mit einer konkreten Meldung.
06 Integrationen
Optionale Integrationen werden zentral unter nexum: konfiguriert. Exponierende Security-, MFA-, Passkey- und Management-APIs bleiben separat und ausdrücklich freizuschalten.
Fachliche Module mit validierten Abhängigkeiten und optionalen, hostbasierten Project-Oberflächen.
UUIDv7-, Timestamp- und Soft-Delete-Basisklassen, Doctrine-Mappings und ein expliziter Entity Store.
Deklarative REST-Ressourcen, Filter, Pagination, Bearer-Tokens, Permissions, MFA und Passkeys.
Filesystem, Mailer, Messenger, QR-Code, Logger, Health Checks und provider-neutrale Verträge.
Provider-neutrale Verträge halten externe SDKs aus dem Framework-Kern heraus. Storage-, Payment-, Search- oder Notification-Anbieter können deshalb über eigene Symfony-Adapter angebunden werden.
07 Security & Betrieb
security.enabled aktiviert Token- und Permission-Services, aber noch keine öffentlichen Tokenrouten. Security-, MFA-, Passkey- und Management-APIs benötigen jeweils einen eigenen Expositionsschalter. Im Project Mode müssen die erlaubten Projects ausdrücklich genannt werden.
Auth-, MFA-, Passkey- und Management-Routen erscheinen nicht allein durch composer require.
Eine aktivierte API verlangt projects: [admin] oder bewusst projects: ['*'].
08 CLI & Diagnose
php bin/console nexum:about
php bin/console nexum:architecture
php bin/console debug:router
php bin/console debug:container Nexum\\Module\\ModuleRegistryInterface
php bin/console debug:container Nexum\\Project\\ProjectContextInterface
php bin/console config:dump-reference nexumnexum:aboutVersionen, Environment und Anzahl der erkannten Modules und Projects.
nexum:architectureKompilierter Architekturgraph mit IDs, Scopes, Dependencies und Zuordnungen.
nexum:user:createBenutzer anlegen, wenn die User-Integration aktiviert ist.
Installiere Nexum, lege einen Descriptor an und prüfe den kompilierten Architekturgraphen.