Laravel api 资源仅当其由用户拥有时

Laravel api resource only if its owned by user

假设一个 user 属于一个 company,每个 company 有许多 projects。现在我想为 projects 创建一个 API 资源。为此,我想与 https://laravel.com/docs/6.x/eloquent-resources

合作

例如,对于控制器的 show 方法,我可以像这样使用 laravel 路由模型绑定来实现:

class ProjectController extends Controller {
    public function show(Project $project) {
        return new ProjectResource($project);
    }
}

这按预期工作。但是,当然,user(由令牌标识 - 这已经在工作)应该只 see/list/update/delete projects 来自他所属的 company

现在我可以忘记路由模型绑定,像这样手动完成它:

    public function show($id, Request $request) {
        $project = Project::query()
            ->where("id", $id)
            ->whereHas("company",function ($query) use ($request) {
                $query->where('id', $request->user()->company_id);
            })
            ->first();

        return $project ? new ProjectResource($project) : Route::respondWithRoute('api.fallback.404');
    }

但这是他们要走的路吗?以相同的方式为所有其他资源(officescustomers 等都属于一家公司)实现此代码看起来像是重复代码?

我当然可以使用本地范围让它变得更好一些,但不确定是否有更好的方法?

使用 Policiescan 中间件。 对于 viewany 场景,我建议考虑全局范围。如果您的应用程序应该过滤 Project 大多数时间,那么全局范围应该可以解决问题。