Laravel Filament v2简单资源中$this->record不存在的问题
解决Laravel Filament v2简单资源中创建用户后无法访问$record的问题
问题出在Filament简单资源的ManageRecords页面逻辑上:普通资源的创建页面(CreateRecord类)会在创建模型后,把实例绑定到页面的$record属性,但简单资源的ManageRecords页面没有这个机制,所以你在after回调里调用$this->record会触发属性不存在的错误。
下面是两种可行的修复方案:
方案一:自定义创建逻辑直接获取模型实例
使用createUsing方法手动创建用户,这样能直接拿到刚创建的模型实例,避免依赖页面的$record属性:
CreateAction::make() ->mutateFormDataUsing(function (array $data): array { $data['password'] = Hash::make(Str::random(30)); return $data; }) ->createUsing(function (array $data) { // 手动创建用户模型 $user = static::getModel()::create($data); // 执行密码重置令牌插入、事件触发和邮件通知逻辑 $token = Str::random(35); DB::table('password_reset_tokens')->insert([ 'email' => $user->email, 'token' => bcrypt($token), 'created_at' => now(), ]); event(new Registered($user)); $user->notify(new ResetPassword($token)); return $user; })
方案二:通过表单数据查询获取用户实例
如果不想修改创建逻辑,可以通过表单提交的唯一标识(比如邮箱)查询刚创建的用户,但这种方式依赖邮箱的唯一性约束:
CreateAction::make() ->mutateFormDataUsing(function (array $data): array { $data['password'] = Hash::make(Str::random(30)); return $data; }) ->after(function(array $data) { // 通过邮箱查询刚创建的用户 $user = static::getModel()::where('email', $data['email'])->first(); if (!$user) return; $token = Str::random(35); DB::table('password_reset_tokens')->insert([ 'email' => $user->email, 'token' => bcrypt($token), 'created_at' => now(), ]); event(new Registered($user)); $user->notify(new ResetPassword($token)); })
推荐使用方案一,因为它更可靠,避免了查询可能带来的并发问题,也符合Filament的扩展逻辑。
内容的提问来源于stack exchange,提问作者Andy Holmes
相关产品推荐
相关产品推荐

