Installation:
composer require leek/filament-dicebear
Publish the config (optional but recommended for customization):
php artisan vendor:publish --tag=filament-dicebear-config
Register in Panel Provider:
Add the plugin and provider to your AppPanelProvider:
use Leek\FilamentDiceBear\DiceBearPlugin;
use Leek\FilamentDiceBear\DiceBearProvider;
public function panel(Panel $panel): Panel {
return $panel
->plugins([DiceBearPlugin::make()])
->defaultAvatarProvider(DiceBearProvider::class);
}
First Use Case: Use the avatar in a Filament resource:
use Leek\FilamentDiceBear\Enums\DiceBearStyle;
public static function table(Table $table): Table {
return $table
->columns([
AvatarColumn::make('avatar')
->avatarProvider(DiceBearProvider::class)
->avatarStyle(DiceBearStyle::Adventurer),
]);
}
Dynamic Avatar Generation:
Override the default avatar for a model in the getAvatar() method:
public function getAvatar(): string {
return DiceBearProvider::make()
->style(DiceBearStyle::Bottts)
->seed($this->name)
->generate();
}
Per-Model Customization:
Use the avatar() method in resources/tables to customize styles per model:
AvatarColumn::make('avatar')
->avatarProvider(DiceBearProvider::class)
->avatarStyle(fn (User $record) => $record->isAdmin()
? DiceBearStyle::BigEars
: DiceBearStyle::Initials),
Self-Hosted Integration: Configure the package to use a local DiceBear instance:
// config/filament-dicebear.php
'self_hosted' => [
'enabled' => true,
'url' => env('DICEBEAR_SELF_HOSTED_URL', 'http://dicebear.local'),
],
Caching Strategies: Leverage Filament’s built-in caching by extending the provider:
class CustomDiceBearProvider extends DiceBearProvider {
public function generate(): string {
return cache()->remember(
"dicebear_{$this->seed}_{$this->style->value}",
now()->addDays(7),
fn () => parent::generate()
);
}
}
DiceBearProvider in Form components for dynamic avatars:
AvatarField::make('avatar')
->avatarProvider(DiceBearProvider::class)
->avatarStyle(DiceBearStyle::PixelArt),
return UserResource::make($user)
->additional(['avatar': DiceBearProvider::make()
->seed($user->email)
->style(DiceBearStyle::Lorelei)
->generate()]);
Caching Conflicts:
php artisan cache:clear
Style Availability:
Initials or BigEars for readability.Self-Hosted Dependencies:
public function generate(): string {
try {
return parent::generate();
} catch (\Exception $e) {
return 'https://default-avatar-url.com';
}
}
Seed Collisions:
email + timestamp) to avoid duplicate avatars:
->seed($user->email . '-' . now()->timestamp)
config/filament-dicebear.php to inspect failed requests:
'debug' => env('DICEBEAR_DEBUG', false),
https://api.dicebear.com/6.x/adventurer/svg?seed=JohnDoe
Custom Providers:
Extend DiceBearProvider to add logic (e.g., role-based styles):
class RoleBasedDiceBearProvider extends DiceBearProvider {
public function generate(): string {
$style = $this->record->isAdmin()
? DiceBearStyle::BigEars
: $this->style;
return parent::withStyle($style)->generate();
}
}
Dynamic Style Resolution: Use closures for runtime style selection:
AvatarColumn::make('avatar')
->avatarStyle(fn (User $record) => match ($record->tier) {
'premium' => DiceBearStyle::Lorelei,
default => DiceBearStyle::Initials,
}),
Fallback Logic: Implement fallback styles or URLs in the provider:
public function generate(): string {
try {
return parent::generate();
} catch (\Exception) {
return 'https://via.placeholder.com/80?text=' . urlencode($this->seed);
}
}
Configuration Overrides: Override config values per environment:
// config/filament-dicebear.php
'styles' => [
'default' => env('DICEBEAR_DEFAULT_STYLE', DiceBearStyle::Adventurer),
],
How can I help you explore Laravel packages today?