composer require rectitude-open/filament-people
php artisan vendor:publish --provider="RectitudeOpen\FilamentPeople\FilamentPeopleServiceProvider"
php artisan migrate
app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\RectitudeOpen\FilamentPeople\FilamentPeoplePlugin::make(),
]);
}
Create a member profile by navigating to Filament Admin → People → Members and clicking "Create Member". Fill in basic fields (name, email, role) and save. The plugin auto-generates a profile page at /admin/people/{member} with avatar, bio, and contact details.
Member Management
Member model via $fillable or add custom attributes in the plugin’s config:
'custom_fields' => [
'department' => 'string',
'hire_date' => 'date',
],
Profile Customization
filament/spatie-laravel-medialibrary (dependency) to upload avatars. Override the avatar field in config/filament-people.php:
'avatar' => [
'disk' => 'public',
'model' => \Spatie\MediaLibrary\HasMedia::class,
],
filament/tinymce) by modifying the Biography widget in the plugin’s resources.Role & Permission Integration
roles or use spatie/laravel-permission:
// In FilamentPeopleServiceProvider::boot()
$this->app->make(\RectitudeOpen\FilamentPeople\Contracts\RoleResolver::class)
->setResolver(function ($member) {
return $member->roles->first()?->name ?? 'guest';
});
API & External Integrations
php artisan vendor:publish --tag="filament-people-routes"
Member model’s syncWithExternalSystem() method.Dependency Conflicts
filament/spatie-laravel-medialibrary and spatie/laravel-permission (if used) are installed and configured before installing filament-people. Run composer require for each dependency explicitly.composer.json for version constraints and resolve conflicts with composer why-not <package>.Migration Issues
members table migration assumes a default schema. Customize via:
php artisan vendor:publish --tag="filament-people-migrations"
Then modify database/migrations/[timestamp]_create_members_table.php.php artisan migrate:fresh if schema changes break the app.Avatar Upload Limits
public disk) may hit size limits. Configure in config/filesystems.php:
'disks' => [
'public' => [
'driver' => 's3',
'url' => env('AWS_URL'),
'visibility' => 'public',
],
],
filament/media-library for advanced upload handling.Role Resolution Edge Cases
RoleResolver returns null, the plugin defaults to 'guest'. Override in app/Providers/FilamentPeopleServiceProvider:
$this->app->singleton(\RectitudeOpen\FilamentPeople\Contracts\RoleResolver::class, function () {
return new class implements RoleResolver {
public function resolve($member): string {
return $member->hasRole('admin') ? 'admin' : 'member';
}
};
});
AppServiceProvider:
public function boot()
{
if (!class_exists(\Spatie\MediaLibrary\HasMedia::class)) {
Log::error('filament-people requires spatie/laravel-medialibrary');
}
}
php artisan vendor:publish --tag="filament-people-views"
Then modify resources/views/vendor/filament-people/....Custom Member Attributes
Add to config/filament-people.php:
'member_attributes' => [
'slack_username' => 'string',
'timezone' => 'string',
],
Then extend the Member model:
public function getSlackUsernameAttribute()
{
return $this->attributes['slack_username'] ?? null;
}
Hooks for Pre/Post Actions Use Filament’s event system to intercept member creation/updates:
// In EventServiceProvider
protected $listen = [
\RectitudeOpen\FilamentPeople\Events\MemberCreated::class => [
\App\Listeners\SendWelcomeEmail::class,
],
];
3. **Localization**
Publish translations:
```bash
php artisan vendor:publish --tag="filament-people-translations"
Then extend resources/lang/vendor/filament-people/....
tests/TestCase.php:
use RectitudeOpen\FilamentPeople\Testing\TestsFilamentPeople;
class MemberTest extends TestCase {
use TestsFilamentPeople;
public function test_member_creation()
{
$member = $this->createMember(['name' => 'John Doe']);
$this->assertDatabaseHas('members', ['name' => 'John Doe']);
}
}
How can I help you explore Laravel packages today?