Laravel 13-tutorial #4: adminpaneel bouwen met Filament
geverifieerd op 7 september 2026 · 6 min
Laravel levert geen back-office mee. Deze serie gebruikt voortaan Filament: composer require filament/filament gevolgd door php artisan filament:install --panels. Voyager, gebruikt in de vorige versies, staat op Packagist als abandoned gemarkeerd en installeert niet meer op Laravel 13.
Laravel levert geen back-office mee. Je moet er zelf een kiezen, en die keuze bindt je project voor jaren. Dit hoofdstuk legt uit waarom deze serie van pakket is gewisseld, en installeert daarna Filament.
Waarom dit hoofdstuk is veranderd
De vorige versies van deze tutorial gebruikten Voyager. Dat is niet langer houdbaar.
tcg/voyager is op Packagist als verlaten gemarkeerd. De laatste versie, 1.8.0, dateert van september 2024 en verklaart compatibiliteit tot en met Laravel 11. Op een Laravel 13-project weigert Composer het simpelweg te installeren: het blokkeert eerst op de beveiligingsadviezen die alle versies raken, en de Laravel 11-beperking zou de afhankelijkheidsresolutie hoe dan ook laten mislukken.
Dat is de nuttige les van deze aflevering: een tutorial die op een pakket van één enkel team leunt, wordt onwaar op de dag dat dat team ermee stopt. Bij de vervanger weegt de gezondheid van het project dus even zwaar als zijn functionaliteiten.
Wat er is bekeken
Vier pistes, op 2 september 2026 gemeten aan de publieke cijfers van Packagist:
| Pakket | Laatste versie | Laravel 13 | Downloads / maand |
|---|---|---|---|
tcg/voyager | 1.8.0 (sep. 2024) | nee | 23.614, maar abandoned |
ilsondev/voyager | 2.2.1 (juli 2026) | ja | 1 |
orchid/platform | 14.53.0 (maart 2026) | ja | 27.227 |
filament/filament | 5.7.8 (aug. 2026) | ja | 3.324.015 |
ilsondev/voyager is een fork die het doet: hij is voor deze herziening op een verse Laravel 13.30.1 geïnstalleerd, en het dashboard, de BREAD-tool, de mediabibliotheek, de menubouwer en de instellingen reageren allemaal correct. Maar hij komt niet verder dan 12 downloads en één ster, en al zijn versies zijn in drie dagen in juli 2026 gepubliceerd. Hij trekt bovendien intervention/image in versie 2 binnen, waarvan de branch niet meer de actuele is. Deze fork aan een beginner aanraden zou precies de fout herhalen die deze tutorial heeft gebroken.
Dat gezegd hebbende: onderhoud je een bestaande Voyager-applicatie en wil je vooral naar Laravel 13 zonder alles te herschrijven, dan is die fork een eerlijke tussenoplossing. Behandel hem als een etappe, niet als een bestemming.
De keuze: Filament
Filament wint om drie redenen.
- Het verdwijnt morgen niet. 3,3 miljoen downloads per maand, honderd keer het publiek van alle alternatieven samen, en elke week nieuwe versies.
- Het back-office is code. Voyager bewaarde de configuratie van de schermen in de database, bij elkaar geklikt in een interface. Bij Filament is elk scherm een PHP-klasse die met de rest van het project in versiebeheer staat. Je leest die terug, vergelijkt hem en deployt hem als elk ander bestand.
- Het is een vaardigheid die je gebruikt. Filament is vandaag het standaard back-office van het Laravel-ecosysteem. Wat je hier leert, kom je in een echt project weer tegen.
Twee betaalde alternatieven zijn het kennen waard, zonder dat ze voor deze tutorial nodig zijn: Nova, de officiële oplossing van het Laravel-team, en Backpack.
Filament installeren
De extensie intl moet aanwezig zijn
Filament vereist de PHP-extensie intl. Controleer die vóór je installeert:
php -m | grep intlGeeft het commando niets terug, dan loopt de installatie stuk op deze melding, die Filament niet noemt en je in het ongewisse laat:
filament/support[...] require ext-intl * -> it is missing from your system.
Install or enable PHP's intl extension.Het eerste hoofdstuk raadde om die reden al aan de extensie te controleren. Op Debian of Ubuntu: sudo apt install php8.4-intl. Op macOS met Homebrew staat ze er al. Op Windows met WampServer vink je php_intl uit en weer aan in het menu met PHP-extensies. Herstart daarna je server.
Het pakket en het paneel
composer require filament/filament
php artisan filament:install --panelsHet tweede commando maakt app/Providers/Filament/AdminPanelProvider.php aan, publiceert de CSS- en JavaScript-bestanden van het paneel in public en leegt de caches.
INFO Successfully published assets!
INFO Successfully upgraded!Een account aanmaken
php artisan make:filament-userHet commando vraagt om een naam, een e-mailadres en een wachtwoord, en bevestigt daarna:
INFO Success! admin@gekkode.test may now log in at http://localhost:8000/admin/login.Ga naar http://127.0.0.1:8000/admin en log in. Het dashboard is leeg: dat hoort zo, er is nog niets aan toevertrouwd. Hoofdstuk 6 voegt er de artikelen, de categorieën en de tags aan toe.
Bepalen wie er binnen mag
In een lokale omgeving laat Filament elke ingelogde gebruiker binnen. Overal elders weigert het iedereen met een 403-fout, zolang het model User niet heeft verteld wie er naar binnen mag. Dat is veilig als standaard, maar het verrast: het paneel werkt op je eigen machine en geeft 403 zodra het online staat.
De regel wordt gedeclareerd door de interface FilamentUser te implementeren. Behoud alles wat het meegeleverde model al bevat, de attributen #[Fillable] en #[Hidden] net als de methode casts(): alleen de interface en de methode canAccessPanel() komen erbij.
<?php
namespace App\Models;
use Database\Factories\UserFactory;
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
use Illuminate\Database\Eloquent\Attributes\Fillable;
use Illuminate\Database\Eloquent\Attributes\Hidden;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
#[Fillable(['name', 'email', 'password'])]
#[Hidden(['password', 'remember_token'])]
class User extends Authenticatable implements FilamentUser
{
/** @use HasFactory<UserFactory> */
use HasFactory, Notifiable;
public function canAccessPanel(Panel $panel): bool
{
return str_ends_with($this->email, '@gekkode.test');
}
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}Vervang het domein door dat van jezelf. Deze regel is bewust simplistisch: goed genoeg voor een leerproject, niet voor een publieke site. Een echt project leunt op een kolom is_admin of op een rollensysteem.
Het gedrag wordt met twee tests gecontroleerd. De tweede telt evenveel als de eerste: in de testomgeving weigert Filament iedereen zolang de regel niet bestaat, dus een test die alleen de weigering controleert zou ook zonder de regel slagen.
<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminTest extends TestCase
{
use RefreshDatabase;
public function test_un_email_hors_domaine_est_refuse(): void
{
$user = User::factory()->create(['email' => 'intrus@example.com']);
$this->actingAs($user)->get('/admin')->assertForbidden();
}
public function test_un_email_du_domaine_est_accepte(): void
{
$user = User::factory()->create(['email' => 'admin@gekkode.test']);
$this->actingAs($user)->get('/admin')->assertOk();
}
}Migreren vanaf de Voyager-versie van deze tutorial
Heb je deze tutorial in de Voyager-versie gevolgd, dan verandert het volgende.
- De tabellen van Voyager verdwijnen. De installatie maakte er tien aan:
data_types,data_rows,menus,menu_items,settings,roles,permissions,permission_role,user_rolesentranslations. Geen daarvan is nog nodig. Je eigen tabellen,posts,categories,tags,post_tag,users, blijven ongewijzigd: Filament sluit erop aan zonder datamigratie. - De BREAD-configuratie gaat verloren, en dat is de bedoeling. Wat je in Voyager bij elkaar had geklikt, schrijf je één keer over in PHP, in de bestanden van hoofdstuk 6. Dat kost een half uur, en daarna staat de configuratie in versiebeheer.
- De functie
setting()bestaat niet meer. Voyager leverde die om de titel en de beschrijving van de site uit te lezen. Vervangsetting('site.title')doorconfig('app.name'), of door je eigen instellingen. - De omweg rond de slug
postsis overbodig geworden. Voyager bracht zijn eigen modelPostmee, waardoor je de slug van de tabel moest hernoemen naarblog-postsen een template van het pakket moest corrigeren. Filament legt geen enkel model op, het conflict verdwijnt. - Het adres van het back-office verandert niet. Filament installeert zich eveneens op
/admin.
Voyager uit een bestaand project halen: composer remove tcg/voyager, en verwijder daarna zijn tabellen en de map resources/views/vendor/voyager als die er is. Maak eerst een back-up van de database.
Wat dit hoofdstuk niet behandeld heeft
Fijnmazige rollen en rechten, het thema van het paneel aanpassen en de widgets van het dashboard vallen buiten deze serie. De documentatie van Filament behandelt ze.
Het volgende hoofdstuk bouwt de homepage van de publieke site.