Laravel API-ресурс, только если он принадлежит пользователю - PullRequest
0 голосов
/ 20 января 2020

Допустим, 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. Которые все принадлежат компании) таким же образом?

Я мог бы конечно сделать его немного лучше, с локальными возможностями, но не уверен, что нет лучших способов?

1 Ответ

1 голос
/ 20 января 2020

Использование Политики и может промежуточного программного обеспечения. Для просмотра любого сценария я предлагаю рассмотреть глобальные возможности. Если ваше приложение должно фильтровать Project большую часть времени, то глобальная область должна решить проблему.

...