Laravel 9中如何向监听器传递用户ID而非对象?
解决方案
1. 修改事件类,传递用户ID而非对象
将事件类的属性和构造函数改为接收并存储用户ID:
class UserCreated { use Dispatchable, InteractsWithSockets, SerializesModels; public int $userId; /** * Create a new event instance. * * @return void */ public function __construct(int $userId) { $this->userId = $userId; } }
2. 调整User模型的事件触发逻辑
默认的$dispatchesEvents会自动传入模型实例,因此需要重写模型的创建钩子,手动分发事件并传入ID:
class User extends Model { // 移除原有的$dispatchesEvents配置,或者保留但通过booted方法覆盖行为 // protected $dispatchesEvents = [ // 'created' => UserCreated::class // ]; protected static function booted() { static::created(function (User $user) { UserCreated::dispatch($user->id); }); } }
3. 监听器添加用户存在性检查
在handle方法中通过ID查询用户,先验证用户是否存在,再执行后续逻辑:
public function handle(UserCreated $event) { $user = User::find($event->userId); if (!$user) { Log::info("用户ID {$event->userId} 已不存在,跳过通知流程"); return; } Log::info($user); // 执行通知、发送邮件等操作 }
可选方案:保留事件接收模型对象但仅存储ID
如果不想修改模型的事件触发方式,也可以在事件构造中只保存用户ID,后续用ID查询:
class UserCreated { use Dispatchable, InteractsWithSockets, SerializesModels; public int $userId; public function __construct(User $user) { $this->userId = $user->id; } }
这种情况下模型的$dispatchesEvents配置可以保留,监听器的逻辑和上述步骤3一致。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

