如何实现类似路由模型绑定的Laravel Notification模型绑定?
实现Laravel Notification的模型自动绑定(类似路由模型绑定)
方法一:构造函数内直接解析(简单直接)
修改TestNotification的构造函数,通过判断传入值类型,自动将ID解析为对应模型实例,行为和路由模型绑定的findOrFail保持一致:
// TestNotification.php use App\Models\User; use Illuminate\Notifications\Notification; class TestNotification extends Notification { public User $user; public function __construct(int|User $user) { // 传入ID则自动查询模型,已传入模型则直接赋值 $this->user = is_int($user) ? User::findOrFail($user) : $user; } // 定义通知渠道、内容等方法... }
控制器代码无需修改,直接传入ID即可:
// ExampleController.php function show($id) { Notification::send(auth()->user(), new TestNotification($id)); }
当ID不存在时,会抛出ModelNotFoundException,和路由模型绑定的异常逻辑一致,可在全局异常处理器中统一处理。
方法二:用Trait复用解析逻辑(多通知场景)
如果多个Notification都需要该能力,可封装Trait复用逻辑:
1. 创建ResolvesModel Trait
// app/Traits/ResolvesModel.php namespace App\Traits; use Illuminate\Database\Eloquent\Model; trait ResolvesModel { /** * 将ID或模型实例解析为模型对象 * @param string $modelClass 模型类全名 * @param int|Model $value ID或模型实例 * @return Model */ protected function resolveModel(string $modelClass, int|Model $value): Model { if ($value instanceof Model) { return $value; } // 支持软删除模型可改为:withTrashed()->findOrFail($value) return app($modelClass)::findOrFail($value); } }
2. 在Notification中使用Trait
// TestNotification.php use App\Traits\ResolvesModel; use App\Models\User; use Illuminate\Notifications\Notification; class TestNotification extends Notification { use ResolvesModel; public User $user; public function __construct(int|User $user) { $this->user = $this->resolveModel(User::class, $user); } // 其他通知方法... }
内容的提问来源于stack exchange,提问作者Hasan ABLAK
相关产品推荐
相关产品推荐

