Laravel如何实现仅user_status变为Active时触发邮件发送功能
解决方案
你只需要调整User模型boot方法中updated事件的判断逻辑即可,Laravel原生提供了字段变更判断的相关方法可以直接使用:
修改后的User模型boot方法代码
public static function boot() { parent::boot(); static::updated(function ($user) { // 仅当user_status字段被修改,且修改后的值为Active时触发事件 if ($user->wasChanged('user_status') && $user->user_status == 'Active') { event(new UserStatusChangeEvent($user)); } }); }
如果需要更严谨,避免本来就是Active状态、用户重复设置为Active的误触发场景,可以再加一层原始值判断:
public static function boot() { parent::boot(); static::updated(function ($user) { // 仅当user_status从非Active变更为Active时触发事件 if ($user->wasChanged('user_status') && $user->user_status == 'Active' && $user->getOriginal('user_status') != 'Active' ) { event(new UserStatusChangeEvent($user)); } }); }
逻辑说明
wasChanged('user_status')用于判断本次更新操作中,user_status字段是否真的被修改并写入了数据库,其他字段(比如is_active)变更时这个判断会返回false,不会进入后续逻辑getOriginal('user_status')可以获取字段修改前的原始值,加这个判断可以过滤掉本来就是Active状态、重复设置为Active的无效触发场景
调整后不需要修改事件、监听器、注册映射的其他代码,即可满足需求。
内容的提问来源于stack exchange,提问作者Hamza Mughal
相关产品推荐
相关产品推荐

