Search code examples
laravellaravel-livewirelaravel-10laravel-filamentfilamentphp

Laravel Filament v2 - $this->record doesn't exist when using a simple resource


Title pretty much says it all, I'm exploring Filament v2 and trying to make a simple modal that creates a user, manipulates the password to be a random string, and then fires an email once saved. When I used this code on a normal resource, everything worked fine. However, when using a simple resource, I keep getting a "Property [$record] not found on component: [app.filament.resources.user-resource.pages.manage-users]" error.

The code in my ManageUser.php file is as follows:

<?php

namespace App\Filament\Resources\UserResource\Pages;

use Filament\Pages\Actions;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Auth\Events\Registered;
use App\Filament\Resources\UserResource;
use Filament\Pages\Actions\CreateAction;
use Filament\Resources\Pages\ManageRecords;
use Illuminate\Auth\Notifications\ResetPassword;

class ManageUsers extends ManageRecords
{
    protected static string $resource = UserResource::class;

    protected function getActions(): array
    {
        return [
            CreateAction::make()
                ->mutateFormDataUsing(function (array $data): array {
                    $data['password'] = Hash::make(Str::random(30));

                    return $data;
                })
                ->after(function(array $data) {
                    dd($this->record);
                    $token = Str::random(35);

                    DB::table('password_reset_tokens')->insert([
                        'email' => $this->record->email,
                        'token' => bcrypt($token),
                        'created_at' => now(), 
                    ]);

                    event(new Registered($this->record));
                    $this->record->notify(new ResetPassword($token));
                })
        ];
    }
}

enter image description here

I'm a bit lost as to what the issue is, have I missed a step?


Solution

  • This was an easy one that I'd overlooked, I thought the $this->record was inherited like it is in the standard resources, but in the simple resources you have to inject it into the function like this:

    ->after(function(Model $record) {
        $token = Str::random(35);
    
        DB::table('password_reset_tokens')->insert([
            'email' => $record->email,
            'token' => bcrypt($token),
            'created_at' => now(), 
        ]);
    
        event(new Registered($record));
        $record->notify(new ResetPassword($token));
    })
    

    Everything works as expected now