Skip to content

Fehlerbehebung & Betrieb

Ein praxisnaher Leitfaden zu den Problemen, auf die Sie tatsächlich stoßen werden, mit Ursache und Lösung. Wenn etwas „nicht angezeigt wird", lautet die Antwort fast immer Module / Rechte / Cache.

In v6 ist das Back-Office die React-Shell unter /melis-react, doch das Framework, die Module und die zugrunde liegende Konfiguration bleiben unverändert — die meisten hier beschriebenen Lösungen sind also weiterhin serverseitig. Wenn ein Tool keine native React-Seite besitzt, rendert die Shell das klassische Tool innerhalb eines iframes (/melis/react-tool-page?key=<melisKey>), und native React-„Brick"-Tools verfügen über einen New (React) / Old (iframe)-Umschalter zu genau diesem klassischen Bildschirm. Zu wissen, welche Schicht man gerade betrachtet, ist oft der erste Diagnoseschritt.

Zuerst die Fehleranzeige aktivieren

Standardmäßig verhält sich Melis bei Fehlern zurückhaltend. Aktivieren Sie den Entwicklungsmodus, um sie sichtbar zu machen:

bash
vendor/bin/laminas-development-mode enable     # status | enable | disable

Dies lädt config/development.config.php, deaktiviert die Config-/Modul-Caches und setzt error_reporting(E_ALL). PHP-Warnungen werden zusätzlich durch den MelisCorePhpWarningListener sichtbar gemacht. Die Fehlerberichterstattung/-anzeige kann außerdem über die Melis-Konfiguration unter /meliscore/datas/errors gesteuert werden.

Beachten Sie, dass die React-API-Endpunkte JSON und nicht HTML zurückgeben: Ein fehlgeschlagener Boot-Aufruf liefert { success: false, error: … } (z. B. { success:false, error:'Unauthenticated' } mit HTTP 401), lesen Sie also den Network-Tab und nicht nur die Seite. Ein Legacy-Tool innerhalb des iframes zeigt weiterhin seine eigenen nativen Fehler (Gritter-Toasts, feldweise Validierungs-Modals) genau wie unter /melis.

Leere Seite, HTTP 200, kein Fehler?

Melis verwendet Output-Buffering; ein Fatal während Bootstrap/Render kann eine leere 200 ergeben. Um die verschluckte Ausnahme zu sehen, hängen Sie vorübergehend einen Listener an MvcEvent::EVENT_DISPATCH_ERROR / EVENT_RENDER_ERROR in public/index.php an (umschließen Sie Application::init() mit try/catch und geben Sie den exception-Parameter aus), oder aktivieren Sie den Entwicklungsmodus.

Cache

Veralteter Cache ist die häufigste Ursache Nr. 1 für „Ich habe die Konfiguration geändert, aber es hat sich nichts geändert". Die Caches befinden sich unter cache/:

cache/meliscore_platform_cache-*   # backoffice zones / platform config
cache/meliscms_page-*              # rendered CMS pages
cache/config/                      # merged Laminas config (if enabled)

Leeren Sie sie, indem Sie die betreffenden Ordner löschen, oder über die API MelisCoreCacheSystemService::deleteCacheByPrefix('*', 'meliscore_platform_cache'). Melis leert Caches außerdem automatisch bei Änderungen an der Modulverwaltung und den Rechten. Nachdem Sie config/melis.module.load.php oder eine app.*.php bearbeitet haben, leeren Sie cache/melis* und laden Sie neu.

Aus dem Back-Office können Sie Caches über das Cache-Tool leeren (dessen React-Bildschirm verfügt über dieselben Tabs wie das klassische Tool). Siehe MelisCacheInternal.

Die React-Shell besitzt eine eigene Caching-Schicht, die zu beachten ist, wenn Dinge veraltet wirken:

  • Das zusammengefasste Bricks-Bundle (/melis/react-api/bricks-bundle.js?v=<sig>) wird 1 Jahr immutable ausgeliefert; seine ?v=-Signatur (Name+mtime+Größe jedes Bricks) ändert sich automatisch, wenn sich die Dateien eines Bricks ändern, sodass ein Hard Refresh das neue Bundle aufnimmt.
  • Die SPA-Shell (index.html) wird mit no-cache ausgeliefert, doch die von ihr referenzierten gehashten JS-/CSS-Assets sind content-hashed und werden gecacht — auch hier ist ein Hard Refresh die Lösung.
  • Wenn ein Tool-iframe nach einer Modules-Änderung mit fehlerhaftem Styling oder einer leeren DataTable lädt, wurden die Plattform-Asset-Bundles unter etc/bundles/ möglicherweise gelöscht; sie reparieren sich selbst (werden beim nächsten Rendern der Tool-Seite neu generiert), aber Sie können dies durch Neuladen des Tools erzwingen.

Häufige Fallstricke

Ein Modul erscheint nicht

UrsacheLösung
Nicht in der LadelisteFügen Sie es zu config/melis.module.load.php hinzu.
Veralteter CacheLeeren Sie cache/melis* und laden Sie neu.
Pfad nicht gemapptStellen Sie sicher, dass es in der generierten config/melis.modules.path.php enthalten ist (neu generiert durch MelisAssetManager).

Ein Tool existiert, ist aber nicht im linken Menü / „You don't have access to this tool"

Das linke React-Menü (GET /melis/react-api/menu) ist der nach Rechten gefilterte Navigationsbaum — dieselbe melis_core_user.usr_rights-XML-Allow-List wie zuvor, nur von der Shell konsumiert.

UrsacheLösung
Benutzer hat keine RechteErteilen Sie den *_toolstree_section des Tools unter Users → Rights, oder über eine Migration (siehe flyway/sql/V3__add_melisai_rights.sql).
Rechte in der Session gecachtRechte werden beim Login geladen und periodisch durch MelisCoreCheckUserRightsListener aktualisiert — melden Sie sich ab und wieder an, nachdem Sie sie geändert haben.
Benutzer inaktivusr_status muss 1 sein.
Modul des Bricks inaktivEin natives React-Tool (Brick) erscheint genau dann, wenn sein Modul aktiv ist — die Shell erkennt Bricks über GET /melis/react-api/react-modules. Aktivieren Sie das Modul.

Ein leeres usr_rights bedeutet Vollzugriff (isAccessible() gibt bei leerem Wert true zurück) — aber bei einem normalen Benutzer mit expliziter Allow-List ist ein fehlender Abschnitt verborgen.

Die Schaltfläche/der Tab eines Tools ist verboten, obwohl ich das Tool öffnen kann (HTTP 403)

v6 fügt erweiterte Rechte („Capabilities") innerhalb eines bereits autorisierten Tools hinzu — die feingranularen List-/Create-/Edit-/Delete-/tabweisen Checkboxen unter Users → Rights.

UrsacheLösung
Capability verweigertDer Controller des Tools hat denyUnlessCan(<cap>) aufgerufen und Ihre Rechte-XML verweigert diese Capability. Heben Sie die Verweigerung unter Users → Rights auf (Matrix der erweiterten Rechte).
In der Session gecachtCapabilities werden im Boot-Aufruf GET /melis/react-api/me (data.capabilities) geliefert — melden Sie sich ab und wieder an, nachdem Sie die Rechte bearbeitet haben.

Capabilities sind default-allow: Ein Tool ohne Deklaration oder eine nicht verweigerte Capability bleibt voll nutzbar; Admins umgehen dies vollständig. Verweigerungen befinden sich in einem eigenen <meliscore_tool_capabilities>-Abschnitt der Rechte-XML, sodass sie das klassische BO nicht beeinflussen.

Ein Legacy-Tool lädt leer / seine Schaltflächen tun nichts innerhalb der React-Shell

Wenn ein Tool keine native React-Seite besitzt, wird es in einem iframe über /melis/react-tool-page?key=<melisKey> gerendert. Eine leere DataTable oder eine tote Schaltfläche dort ist fast immer eine fehlende Modul-Ressource (deren eigene *.tool.js/CSS nicht eingebunden wurde).

UrsacheLösung
Modul-Ressource nicht geladenDie Tool-Seite bindet die ressources jedes Moduls ein; ein neu beigesteuerter Tab/Button, der JS liefert, das der Seite unbekannt ist, benötigt die Registrierung seines Plugin-Roots (oder einen toolpage_extensions-Hook — siehe Ein Tool erstellen).
Vergleich mit /melisÖffnen Sie dasselbe Tool direkt unter /melis (oder über den Old-Umschalter des Tools). Ist es auch dort defekt, liegt das Problem im Tool selbst und nicht im React-Frame.

Datenbankverbindungsfehler

UrsacheLösung
Plattform-Datei fehltconfig/autoload/platforms/<MELIS_PLATFORM>.php muss existieren und mit der Umgebungsvariable MELIS_PLATFORM übereinstimmen.
Falsche ZugangsdatenPrüfen Sie die von der Plattform-Datei konsumierten MYSQL_*-Umgebungsvariablen.

Assets (CSS/JS) 404

UrsacheLösung
Modul nicht gemapptPrüfen Sie config/melis.modules.path.php.
Bundles nicht gebautBauen Sie die Assets neu (Webpack-Build / vendor/bin/phing).
Stylesheet als HTML beantwortetEine abgelaufene Session leitete eine Bundle-Anfrage früher auf die HTML-Login-Seite um (der Browser lehnt den MIME-Typ ab); v6 liefert das Plattform-Bundle unter /melis/react-platform-bundle mit dem korrekten Typ aus und hält es öffentlich — ein Hard Refresh beseitigt die veraltete Ablehnung.

Übersetzungen zeigen den rohen tr_…-Schlüssel

UrsacheLösung
Locale nicht gesetztDie aktive Locale stammt aus der Session (melis-lang-locale); der Sprachumschalter im React-Header schreibt sie (GET /melis/react-api/langs).
Datei fehltFügen Sie language/<locale>.interface.php hinzu; en_EN ist der Fallback.

Datenbankschema (dbdeploy & flyway)

  • dbdeploy (MelisDbDeploy) läuft bei composer update (Post-Update-Hook), um die nummerierten SQL-Deltas jedes Moduls anzuwenden, verfolgt in der changelog-Tabelle.
  • flyway (MelisFlyway) wendet Projektmigrationen in flyway/sql/ an (flyway -configFiles=flyway/conf/flyway.conf migrate).

CLI- & Build-Tools

bash
vendor/bin/laminas-development-mode {status|enable|disable}   # dev mode
flyway -configFiles=flyway/conf/flyway.conf {migrate|info|repair}   # DB migrations
vendor/bin/phing                                             # build assets/bundles

composer update löst die Melis-Hooks (Modul-Deploy + dbdeploy) über composer.jsonpost-update-cmd aus.

Wo Sie nachschauen sollten

AnliegenPfad
Vorlage für den Dev-Modusconfig/development.config.php.dist
Cache-APIvendor/melisplatform/melis-core/src/Service/MelisCoreCacheSystemService.php
Rechte-Aktualisierungvendor/melisplatform/melis-core/src/Listener/MelisCoreCheckUserRightsListener.php
PHP-Warnungenvendor/melisplatform/melis-core/src/Listener/MelisCorePhpWarningListener.php
Modul-Assemblyvendor/melisplatform/melis-core/src/MelisModuleManager.php
React-API (menu / me / capabilities)vendor/melisplatform/melis-react-api/src/Controller/MelisReactApiController.php
React-Shell / iframe-Tool-Seitenvendor/melisplatform/melis-react-override/src/Controller/PluginViewController.php
Flyway-Konfigurationflyway/conf/flyway.conf, Migrationen in flyway/sql/