You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类似路由模型绑定的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:35:22