// set AdminPanelProvider.php
use App\Models\Team;
use App\Filament\Pages\Tenancy\RegisterTeam;
->tenant(Team::class, slugAttribute: 'slug')
->tenantRegistration(RegisterTeam::class);
// buat model dan migration
php artisan make:model Team -m
// edit create_teams_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('teams', function (Blueprint $table) {
$table->id();
$table->string('name', 100)->unique();
$table->string('slug', 100)->unique();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('teams');
}
};
// edit User.php
<?php
namespace App\Models;
use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasTenants;
use Filament\Panel;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Collection;
class User extends Authenticatable implements FilamentUser, HasTenants
{
// ...
public function teams(): BelongsToMany
{
return $this->belongsToMany(Team::class);
}
public function getTenants(Panel $panel): Collection
{
return $this->teams;
}
public function canAccessTenant(Model $tenant): bool
{
return $this->teams()->whereKey($tenant)->exists();
}
}
// buat tabel
php artisan make:migration create_team_user_table
// edit tabel
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('team_user', function (Blueprint $table) {
$table->id();
$table->foreignId('team_id')->constrained('teams')->cascadeOnDelete();
$table->foreignId('user_id')->constrained('users')->cascadeOnDelete();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('team_user');
}
};
// buat file
Filament/Pages/Tenancy/RegisterTeam.php
// edit file RegisterTeam.php
namespace App\Filament\Pages\Tenancy;
use App\Models\Team;
use Filament\Forms\Components\TextInput;
use Filament\Pages\Tenancy\RegisterTenant;
use Filament\Schemas\Schema;
class RegisterTeam extends RegisterTenant
{
public static function getLabel(): string
{
return 'Register team';
}
public function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required()
->unique()
->maxLength(100),
]);
}
protected function handleRegistration(array $data): Team
{
$team = Team::create($data);
$team->members()->attach(auth()->user());
return $team;
}
}
// buat fungsi member() di model Team.php
protected $fillable = [
'name',
'slug',
];
public function members(): BelongsToMany
{
return $this->belongsToMany(User::class);
}
// buat observer
php artisan make:observer
TeamObserver
Team
// edit TeamObserver
<?php
namespace App\Observers;
use App\Models\Team;
// use function Livewire\str;
class TeamObserver
{
/**
* Handle the Team "created" event.
*/
public function creating(Team $team): void
{
$team->slug = str()->slug($team->name);
}
/**
* Handle the Team "created" event.
*/
public function created(Team $team): void
{
//
}
/**
* Handle the Team "updated" event.
*/
public function updated(Team $team): void
{
//
}
/**
* Handle the Team "deleted" event.
*/
public function deleted(Team $team): void
{
//
}
/**
* Handle the Team "restored" event.
*/
public function restored(Team $team): void
{
//
}
/**
* Handle the Team "force deleted" event.
*/
public function forceDeleted(Team $team): void
{
//
}
}
// pasang TeamObserver di Team model
#[ObservedBy(TeamObserver::class)]
// batasi regist team , edit registerteam
// membatasi hanya akun id 1 yang bisa melihat
public static function canView(): bool
{
return auth()->user()->id == 1;
}
// buat untuk semua team id jika sudah punya migration
php artisan make:migration add_team_id_in_users_table
// edit migration
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->foreignId('team_id')->nullable()->after('id')->constrained('teams')->cascadeOnDelete();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropForeign(['team_id']);
$table->dropColumn('team_id');
});
}
};
// edit Team.php model
public function users(): HasMany
{
return $this->hasMany(User::class);
}
// edit user.php model
public function team(): BelongsTo
{
return $this->belongsTo(Team::class);
}
// buat agar user team otomatis dibikin saat user di buat
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Resources\Pages\CreateRecord;
class CreateUser extends CreateRecord
{
protected static string $resource = UserResource::class;
protected function afterCreate(): void
{
$team = filament()->getTenant();
if ($team) {
$team->members()->attach($this->record->id);
}
}
}