Допустим, user
принадлежит company
, а каждый company
имеет множество projects
. Теперь я хочу создать ресурс API для projects
. Для этого я хочу работать с https://laravel.com/docs/6.x/eloquent-resources
Например, для show
метода контроллера, я мог бы сделать это с laravel привязкой модели маршрута следующим образом:
class ProjectController extends Controller {
public function show(Project $project) {
return new ProjectResource($project);
}
}
Работает как положено. Но, конечно, user
(идентифицируемый токеном - это уже работает) должен видеть / 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');
}
Но это путь к go? Это похоже на дублирование кода для реализации этого для всех других ресурсов (offices
, customers
, et c. Которые все принадлежат компании) таким же образом?
Я мог бы конечно сделать его немного лучше, с локальными возможностями, но не уверен, что нет лучших способов?