iToverDose/Software· 4 MAI 2026 · 05:39

Filament v5: Eine umfassende Anleitung zur Implementierung von Multi-Tenancy

Lernen Sie, wie Sie mit Filament eine Anwendung erstellen, die mehrere Kunden mit separaten Daten bedient. Diese Anleitung zeigt Ihnen, wie Sie Multi-Tenancy implementieren

DEV Community2 min0 Kommentare

Die Frage, wie man eine Anwendung für mehrere Kunden mit separaten Daten erstellt, ist ein häufiges Problem bei der Entwicklung von SaaS-Anwendungen. Wenn Sie mit Filament arbeiten, haben Sie Glück, da es ein integriertes System für Multi-Tenancy bietet. Dieses System ermöglicht es Ihnen, mehrere Mandanten zu verwalten und den Zugriff auf Ressourcen zu beschränken.

Wie funktioniert die Multi-Tenancy in Filament

Bevor wir mit der Implementierung beginnen, ist es wichtig zu verstehen, wie die Multi-Tenancy in Filament funktioniert. Filament verwendet eine gemeinsame Datenbank mit einer vielen-zu-vielen-Beziehung zwischen Benutzern und Mandanten. Ein Benutzer kann mehreren Mandanten angehören und jeder Mandant kann mehrere Benutzer haben. Jede Ressource, wie Projekte oder Rechnungen, gehört zu einem bestimmten Mandanten.

Schritt 1: Erstellen des Mandantenmodells

Um die Multi-Tenancy zu implementieren, müssen Sie ein Mandantenmodell erstellen. Dies kann ein Team, eine Organisation oder ein Unternehmen sein. In diesem Beispiel verwenden wir den Begriff „Team“. Sie müssen ein Modell, eine Migration und eine Pivot-Tabelle erstellen.

php artisan make:model Team -m
php artisan make:migration create_team_user_table

Die Migration für die Teams-Tabelle:

Schema::create('teams', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('slug')->unique();
    $table->timestamps();
});

Die Pivot-Tabelle:

Schema::create('team_user', function (Blueprint $table) {
    $table->id();
    $table->foreignId('team_id')->constrained()->cascadeOnDelete();
    $table->foreignId('user_id')->constrained()->cascadeOnDelete();
    $table->string('role')->default('member');
    $table->timestamps();
    $table->unique(['team_id', 'user_id']);
});

Schritt 2: Einrichten der Beziehungen

Das Team-Modell benötigt eine Beziehung zu den Benutzern und das HasName-Interface, damit Filament den Team-Namen im Switcher anzeigen kann.

namespace AppModels;
use FilamentModelsContractsHasName;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsToMany;

class Team extends Model implements HasName {
    protected $fillable = ['name', 'slug'];

    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class)->withPivot('role')->withTimestamps();
    }

    public function getFilamentName(): string
    {
        return $this->name;
    }
}

Das Benutzer-Modell benötigt das HasTenants-Interface, um Filament mitzuteilen, welche Mandanten der Benutzer angehört und ob er Zugriff auf einen bestimmten Mandanten hat.

namespace AppModels;
use FilamentModelsContractsFilamentUser;
use FilamentModelsContractsHasTenants;
use FilamentPanel;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsToMany;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateSupportCollection;

class User extends Authenticatable implements FilamentUser, HasTenants
{
    public function teams(): BelongsToMany
    {
        return $this->belongsToMany(Team::class)->withPivot('role')->withTimestamps();
    }

    public function getTenants(Panel $panel): array|Collection
    {
        return $this->teams;
    }

    public function canAccessTenant(Model $tenant): bool
    {
        return $this->teams()->whereKey($tenant)->exists();
    }

    public function canAccessPanel(Panel $panel): bool
    {
        return true;
    }
}

Schritt 3: Konfigurieren des Panels

Öffnen Sie den Panel-Provider (in der Regel app/Providers/Filament/AdminPanelProvider.php) und fügen Sie die Mandanten-Konfiguration hinzu.

use AppModelsTeam;
use AppFilamentPagesTenancyRegisterTeam;
use AppFilamentPagesTenancyEditTeamProfile;

public function panel(Panel $panel): Panel
{
    return $panel
        ->default()
        ->id('admin')
        ->path('admin')
        ->login()
        ->registration()
        ->tenant(Team::class, slugAttribute: 'slug')
        ->tenantRegistration(RegisterTeam::class)
        ->tenantProfile(EditTeamProfile::class);
}

Nachdem ein Benutzer angemeldet ist, leitet Filament ihn zu seinem ersten Team weiter (aus getTenants()). Wenn er noch kein Team hat, wird er zur Registrierungsseite weitergeleitet.

Ausblick

Die Implementierung von Multi-Tenancy in Filament ist ein wichtiger Schritt bei der Entwicklung von SaaS-Anwendungen. Mit dieser Anleitung haben Sie gelernt, wie Sie ein Mandantenmodell erstellen, Beziehungen einrichten und das Panel konfigurieren. Jetzt können Sie Ihre Anwendung für mehrere Kunden mit separaten Daten bereitstellen.

KI-Zusammenfassung

Filament ile çok kiracılı uygulamalar oluşturmak için gereken adımları öğrenin. Tenant modeli, kullanıcı ilişkileri, panel yapılandırması ve daha fazlası

Kommentare

00
KOMMENTAR SCHREIBEN
ID #0BQP1V

0 / 1200 ZEICHEN

Menschen-Check

2 + 7 = ?

Erscheint nach redaktioneller Prüfung

Moderation · Spam-Schutz aktiv

Noch keine Kommentare. Sei der erste.