Regelbasiertes Governance- und Integritäts-Plugin für Shopware 6.
FibIntegrityGuard definiert versionierbare Regeln und setzt sie zur Laufzeit in kritischen Pfaden durch:
- DAL Writes (Create/Update/Delete)
- Cart / Checkout
- State Machine Transitions
- API/Import als vorbereitete Scopes (erweiterbar)
Zusätzlich wird jede Regelverletzung als Audit-Event in einer eigenen Violation-Entität gespeichert.
In vielen Shops sind Regeln verteilt über:
- DAL-Validierungen
- Subscriber/Services
- Checkout-Logik
- individuelle Sonderfälle
Das macht Governance schwer nachvollziehbar. FibIntegrityGuard zentralisiert diese Logik in einem einheitlichen Regelmodell.
Entity: fib_integrity_rule
Wichtige Felder:
namescope(dal_write,cart,state_transition,api)entityName(z. B.product,order,cart,*)trigger(z. B.create,update,delete,checkout,enter_state,*)conditionType(aktuell:symfony_expression)condition(Expression)severity(info,warning,critical)enforcement(log,warn,block,fix)fixAction(JSON, MVP aktuell nur dokumentiert/geloggt)priority,activevalidFrom,validTochannelIds(JSON-Liste, scoped rules)version,previousRuleId
Entity: fib_integrity_policy
Wichtige Felder:
namescope(cart,state_transition,dal_write,api)ruleId(FK auf Shopwarerule)enforcement(log,warn,block,fix)severity(info,warning,critical)entityName,triggerpriority,activevalidFrom,validTochannelIds(JSON-Liste)message,description
Damit kann der Merchant den Shopware Rule Builder als Condition-UX nutzen, während FibIntegrityGuard die Durchsetzung übernimmt.
Entity: fib_integrity_violation
Speichert pro Treffer:
ruleIdcontextData(z. B. User/SalesChannel/SourceType)entityName,entityId,operationpayloadSnapshotBefore,payloadSnapshotAftermessage,severity,createdAt
RuleEngine lädt aktive Regeln nach Scope, sortiert nach Priorität und evaluiert die Condition gegen ein standardisiertes Context-Objekt:
entitybeforeoperationusersalesChannelcart(im Cart-Scope)context
Condition Engine: Symfony ExpressionLanguage (+ Helper-Funktionen regex_match(), contains()).
Zusätzlich gibt es einen Rule-Builder-Policy-Evaluator (RuleBuilderPolicyEvaluator), der Shopware-Regeln gegen CartRuleScope auswertet.
Subscriber auf PreWriteValidationEvent:
- evaluiert nur Regeln mit
enforcement=block - bei Treffer:
WriteConstraintViolationException-> Write wird abgebrochen
Subscriber auf EntityWrittenEvent:
- evaluiert
log,warn,fix - schreibt Violation-Audit
- kein nachträgliches hartes Blocken
Eigener CartValidator:
- evaluiert zuerst
fib_integrity_policy(Rule Builder) im Cart-Scope - Scope
cart, Triggercheckout - bei
block:GenericCartError-> Checkout wird verhindert - evaluiert danach weiterhin
fib_integrity_rule(Expression-Modus, Advanced)
Subscriber auf StateMachineTransitionEvent:
- Scope
state_transition, Triggerenter_state blockwirft Exception und stoppt Transition
Enthaltenes Administration-Modul mit:
- Rule List (Filter/Sort/Paging)
- Rule Detail (Create/Edit)
- Policy List (Filter/Sort/Paging)
- Policy Detail (Create/Edit, Rule-Builder-Regelzuordnung)
- Violation List (Inbox)
Hinweis: Ein integrierter "Test Rule against payload" Runner ist als nächster Ausbauschritt vorgesehen.
Shopware führt bei plugin:install kein Composer für custom/plugins/* aus.
Das Plugin benötigt:
symfony/expression-language
Diese Dependency muss vor Aktivierung verfügbar sein (Root-Composer oder gebündeltes Plugin-Vendor).
- Abhängigkeit installieren (im Projekt):
composer require symfony/expression-language - Plugin bekannt machen:
bin/console plugin:refresh - Plugin installieren/aktivieren:
bin/console plugin:install --activate FibIntegrityGuard - Migrationen ausführen:
bin/console database:migrate --all FibIntegrityGuard - Cache leeren:
bin/console cache:clear - Admin Build aktualisieren (je nach Setup):
bin/console bundle:dumpbin/console administration:build
Für Demo-/Testzwecke gibt es einen optionalen Seed-Command. Er wird nie automatisch ausgeführt.
Seed (inaktiv, sicherer Default):
bin/console fib:integrity-guard:seed
Seed + aktivierte Demo-Regeln/-Policies:
bin/console fib:integrity-guard:seed --activate
Vorhandene Demo-Daten löschen und neu erzeugen:
bin/console fib:integrity-guard:seed --reset
Der Command legt an:
- eine Shopware Rule-Builder-Regel (
alwaysValid) für Policy-Demos - Beispiel-Policies in
fib_integrity_policy - Beispiel-Expression-Regeln in
fib_integrity_rule
scope:dal_writeentityName:producttrigger:updatecondition:entity.stock < 0enforcement:block
scope:cartentityName:carttrigger:checkoutcondition:contains(user.vatIds, null) or user.vatIds == []enforcement:block
scope:state_transitionentityName:order_transactiontrigger:enter_statecondition:entity.toState == "paid" and entity.fromState != "authorized"enforcement:block
- Keine Raw-PHP-Evaluation, nur ExpressionLanguage.
- Regeln/Policies/Violations sind vom eigenen Rule-Loop ausgenommen (Rekursionsschutz).
- Violation-Writes laufen in einem eigenen Context-State, um Endlosschleifen zu verhindern.
fixActionwird aktuell geloggt, aber nicht automatisch angewendet.channelIdsist JSON-basiert, noch keine native ManyToMany-Verknüpfung.- Kein Admin-Test-Runner für Conditions.
- Kein spezifischer API-Scope-Subscriber und kein dedizierter Import/Queue-Hook (Scope-Feld ist vorbereitet).
- Rule Test Runner im Admin (
sample payload -> evaluation result) - ACL/Privileges für Rule-Management verfeinern
channelIdsauf echte Relation umstellen- Auto-Fix-Strategien (
fixAction) kontrolliert aktivieren - Version-Diff UI im Admin