隐式绑定路由中间件的问题

我的路由

# 这里不限制 status
Route::resource('user.exposures', UserExposuresController::class)->scoped();
# 这里限定 status 为 1
Route::resource('exposures', ExposuresController::class)
    ->middleware([ScopeStatus::class])
    ->only(['index', 'show']);

ScopeStatus 中间件

public function handle(Request $request, Closure $next)
{
    app()->bind('scope.status', function () {
        return true;
    });

    return $next($request);
}

Exposure 模型

public static function booted()
{
    if (app('scope.status')) {
        static::addGlobalScope(new StatusScope);
    }
}

问题

index 没有问题, 但是 show 方法,是先获得了模型后执行的中间件,也就是 booted 中获得的 app('scope.status')false,这样我就没办法排除 status0 的模型

我试过直接在中间件加全局查询范围,结果也是一样的

public function handle(Request $request, Closure $next)
{
    Exposure::addGlobalScope('status', function (Builder $builder) {
        $builder->where('status', 1);
    });
    return $next($request);
}

大家有什么优雅的解决办法

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
lochpure
最佳答案

我这种情况一般不走中间件限制,用「用户授权」里面的策略解决,个人浅见

1年前 评论
讨论数量: 5

show怎么个提前用的模型?

1年前 评论
sanders

要不就不在 show 方法里面注入模型,show 方法获取 id 再去 find 。

1年前 评论
lochpure

我这种情况一般不走中间件限制,用「用户授权」里面的策略解决,个人浅见

1年前 评论

如果我有这种需求,我首先不回在中间件中去实现,既然已经是不同的控制器了,直接在控制器或者服务类中使用模型的 Scope 方式搞定了。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!