Laravel Nova ist schnell aufgesetzt — ein paar Resources, fertig ist das Backend. Spannend wird es erst, wenn dasselbe Panel mehrere Kunden bedienen soll, jeder mit eigenen Daten, eigenem Branding und eigenen Rechten. Nach drei Iterationen von Codo und einem Connected-Product-Portal sind hier die Muster, die sich gehalten haben.
Mandanten gehören in den Query-Scope, nicht in die UI
Die erste Versuchung ist, in jeder Resource per Filter den Mandanten auszuwählen. Das skaliert nicht und ist eine Datenschutz-Falle. Stattdessen lebt die Mandanten-Trennung in einem globalen Scope auf dem Model — der aktuelle Tenant kommt aus dem eingeloggten User, nicht aus der Anfrage.
protected static function booted(): void
{
static::addGlobalScope('tenant', function (Builder $q) {
if ($tenantId = auth()->user()?->tenant_id) {
$q->where('tenant_id', $tenantId);
}
});
}Damit ist jede Nova-Resource, jede Relation und jede Metrik automatisch mandantensicher — ohne dass man es in 40 Resources einzeln vergessen kann.
Policies sind die halbe Miete
Nova respektiert Laravel-Policies vollständig. Rollenbasierte Rechte gehören dort hinein, nicht in `canSee`-Closures verstreut über die Resources. Eine zentrale Policy pro Model, eine klare Rollen-Matrix — und die UI passt sich von selbst an.
- Sichtbarkeit von Resources über `authorizedToViewAny` aus der Policy ableiten
- Felder pro Rolle mit `->canSee()` ausblenden, aber die Logik aus der Policy ziehen
- Actions immer zusätzlich serverseitig absichern — die UI ist kein Schutz
Theming pro Mandant ohne Panel-Wildwuchs
Markenspezifisches Frontend je Kunde (bei Codo u.a. Kemper und Muli Cycles) heißt nicht: ein Panel pro Kunde. Das Branding kommt aus der Tenant-Konfiguration — Logo, Akzentfarbe, ein paar CSS-Variablen — und wird zur Laufzeit injiziert. Ein Codebestand, n Erscheinungsbilder.
Was bei 12 Mandanten zählt
Bei einer Handvoll Kunden verzeiht Nova fast alles. Ab etwa einem Dutzend merkt man, ob die Struktur trägt: Eager Loading gegen N+1 in den Index-Views, Metriken mit Caching statt Live-Aggregation, und ein striktes „ein Konzept, einmal gelöst"-Prinzip. Der Rest ist Disziplin — und das Wissen, dass der Kollege in zwei Jahren das auch noch lesen können muss.