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_tableDie 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ı