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');
}
但这是他们要走的路吗?以相同的方式为所有其他资源(offices
、customers
等都属于一家公司)实现此代码看起来像是重复代码?
我当然可以使用本地范围让它变得更好一些,但不确定是否有更好的方法?
使用 Policies 和 can 中间件。
对于 viewany 场景,我建议考虑全局范围。如果您的应用程序应该过滤 Project
大多数时间,那么全局范围应该可以解决问题。
假设一个 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');
}
但这是他们要走的路吗?以相同的方式为所有其他资源(offices
、customers
等都属于一家公司)实现此代码看起来像是重复代码?
我当然可以使用本地范围让它变得更好一些,但不确定是否有更好的方法?
使用 Policies 和 can 中间件。
对于 viewany 场景,我建议考虑全局范围。如果您的应用程序应该过滤 Project
大多数时间,那么全局范围应该可以解决问题。