通过POST API更新Laravel模型属性时如何触发对应事件?
Laravel API更新模型后触发自定义事件的实现方案
1. 创建自定义事件类
- 执行Artisan命令生成事件文件:
php artisan make:event ModelAttributeUpdated - 编辑生成的
app/Events/ModelAttributeUpdated.php,注入修改后的模型实例:
namespace App\Events; use App\Models\YourModel; // 替换为实际的业务模型类名 use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class ModelAttributeUpdated { use Dispatchable, SerializesModels; public $model; // 构造函数接收更新后的模型实例 public function __construct(YourModel $model) { $this->model = $model; } }
2. 创建事件监听器
- 执行Artisan命令生成监听器文件:
php artisan make:listener SendChangeNotification --event=ModelAttributeUpdated - 编辑生成的
app/Listeners/SendChangeNotification.php,在handle方法中编写业务逻辑:
namespace App\Listeners; use App\Events\ModelAttributeUpdated; use Illuminate\Contracts\Queue\ShouldQueue; // 如果需要异步执行避免阻塞API响应,实现ShouldQueue接口即可 class SendChangeNotification implements ShouldQueue { public function handle(ModelAttributeUpdated $event) { $updatedModel = $event->model; // 此处编写发送邮件、短信等自定义逻辑 // 示例:\Mail::to($updatedModel->user)->send(new AttributeChangeNotify($updatedModel)); } }
3. 注册事件与监听器的映射关系
- 打开
app/Providers/EventServiceProvider.php,在$listen数组中添加绑定:
protected $listen = [ \App\Events\ModelAttributeUpdated::class => [ \App\Listeners\SendChangeNotification::class, // 同一事件可绑定多个监听器,后续扩展直接在该数组下新增即可 ], ];
- 执行命令清除事件缓存让配置生效:
php artisan event:clear
4. 在API更新逻辑中触发事件
找到POST更新接口对应的控制器方法,在模型保存成功后调用事件分发即可:
public function update(Request $request, $id) { $model = \App\Models\YourModel::findOrFail($id); // 模型属性更新逻辑 $model->fill($request->only(['field1', 'field2']))->save(); // 保存完成后触发事件 \App\Events\ModelAttributeUpdated::dispatch($model); return response()->json(['code' => 200, 'message' => '更新成功']); }
可选扩展:模型全局监听方案
如果希望只要该模型属性发生更新(不管是API调用还是其他业务场景修改)都自动触发事件,可以使用模型观察者,无需在控制器手动分发事件:
- 生成观察者类:
php artisan make:observer YourModelObserver --model=YourModel - 编辑观察者的
updated方法:
namespace App\Observers; use App\Models\YourModel; class YourModelObserver { public function updated(YourModel $model) { // 可指定仅关心的字段变更时才触发事件,避免无关字段更新触发逻辑 if ($model->wasChanged(['field1', 'field2'])) { \App\Events\ModelAttributeUpdated::dispatch($model); } } }
- 在
EventServiceProvider的boot方法中注册观察者:
public function boot() { \App\Models\YourModel::observe(\App\Observers\YourModelObserver::class); }
内容的提问来源于stack exchange,提问作者Mehdi Yaghoubi
相关产品推荐
相关产品推荐

