I was working on a project in Laravel using FilamentPHP v3 and decided to write this article to share how simple it is to add a user profile picture feature and display it as an avatar. Let’s dive in!

1. Add/Update Profile picture option:

Step 1: Update Your Database

First, we need to add a column to store the profile picture in the database. If you’re using a User model, add new migration:

php artisan make:migration add_avatar_to_users_table
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('avatar')->nullable()->after('password');
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('avatar');
        });
    }
};

After this run the migration php artisan migrate.

Step 2: Update the User Model

Update your User model with the new fillable field:

protected $fillable = [
    ...
    'avatar'
];

Step 3: Create filament Profile page

Run this command to generate Profile page in filament:

php artisan make:filament-page Profile

This will generate app/Filament/Pages/Profile.php. In Profile.php use the following code:

<?php

namespace App\Filament\Pages;

use Filament\Forms;
use Filament\Forms\Form;
use Filament\Pages\Auth\EditProfile;
use Illuminate\Support\Facades\Storage;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;

class Profile extends EditProfile
{
    public function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\Section::make()
                    ->schema([
                        Forms\Components\FileUpload::make('avatar')
                            ->image()
                            ->imageEditor()
                            ->circleCropper()
                            ->directory('avatars')
                            ->moveFiles()
                            ->columnSpanFull()
                            ->afterStateUpdated(function ($state) {
                                if (! $state instanceof TemporaryUploadedFile) return;
                                
                                // Delete old avatar if exists
                                $oldAvatar = auth()->user()->avatar;
                                if ($oldAvatar && Storage::exists($oldAvatar)) {
                                    Storage::delete($oldAvatar);
                                }
                            }),
                        $this->getNameFormComponent(),
                        $this->getEmailFormComponent(),
                        $this->getPasswordFormComponent(),
                        $this->getPasswordConfirmationFormComponent(),
                    ])
                    ->columns(1),
            ]);
    }
}

Step 4: Update the AdminPanelProvider

In your AdminPanelProvider ->profile() pass Profile::class we created above:

class AdminPanelProvider extends PanelProvider
{
    public function panel(Panel $panel): Panel
    {
        return $panel
            ->default()
            ->id('admin')
            ->path('admin')
            ->login()
            ->profile(Profile::class, isSimple: false)

Make sure to import use App\Filament\Pages\Profile;

That’s it.

2. Display Profile picture in Avatar

Step 1: Update the User Model

Define avatar URL function in your User model:

public function getFilamentAvatarUrl(): ?string
{
    return $this->avatar ? Storage::url($this->avatar) : null;
}

Step 2: Create your custom GetAvatarProvider

Create app/Filament/AvatarProviders/GetAvatarProvider.php and paste the following code:

<?php

namespace App\Filament\AvatarProviders;

use Filament\AvatarProviders\Contracts\AvatarProvider;
use Illuminate\Database\Eloquent\Model;

class GetAvatarProvider implements AvatarProvider
{
    public function get(Model $record): string
    {
        if (method_exists($record, 'getFilamentAvatarUrl')) {
            return $record->getFilamentAvatarUrl() ?? $this->getDefaultAvatar($record);
        }

        return $this->getDefaultAvatar($record);
    }

    protected function getDefaultAvatar(Model $record): string
    {
        return 'https://ui-avatars.com/api/?name=' . urlencode($record->name) . '&color=FFFFFF&background=111827';
    }
}

Step 3: Update the AdminPanelProvider

Now simply call the GetAvatarProvider we just created

->defaultAvatarProvider(GetAvatarProvider::class)

and same make sure to import use App\Filament\AvatarProviders\GetAvatarProvider;.

Conclusion

In this article, we learned how to add and update a user profile picture feature in Laravel FilamentPHP v3 and display it as an avatar. With just a few steps, you can improve your application’s user interface and provide a personalized touch for your users.

If you found this article helpful, feel free to share it with others in the Laravel community. Happy coding!

Categorized in:

Laravel,

Tagged in: