У цій частині ми розглянемо, як реалізувати основні операції CRUD (Create, Read, Update, Delete) для наших сутностей, зосереджуючись на управлінні правами доступу.
ProjectController
Почнемо з контролера для проектів:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?php namespace App\Http\Controllers; use App\Models\Project; use Illuminate\Http\Request; class ProjectController extends Controller { public function index() { $projects = Project::all(); return response()->json($projects); } public function store(Request $request) { $validatedData = $request->validate([ 'name' => 'required|string|max:255', ]); $project = Project::create($validatedData); return response()->json($project, 201); } public function show(Project $project) { return response()->json($project); } public function update(Request $request, Project $project) { $validatedData = $request->validate([ 'name' => 'required|string|max:255', ]); $project->update($validatedData); return response()->json($project); } public function destroy(Project $project) { $project->delete(); return response()->json(null, 204); } } |
ProjectPermissionController
Тепер розглянемо контролер для управління правами доступу:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
<?php namespace App\Http\Controllers; use App\Models\Project; use App\Models\ProjectPermission; use Illuminate\Http\Request; class ProjectPermissionController extends Controller { public function index(Request $request, Project $project) { $permissions = ProjectPermission::whereHas('roles', function ($query) use ($project) { $query->where('project_id', $project->id); })->get(); return response()->json($permissions); } public function store(Request $request, Project $project) { $validatedData = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', ]); $permission = ProjectPermission::create($validatedData); // Прив'язуємо дозвіл до вказаних ролей проекту if ($request->has('role_ids')) { $roleIds = $request->input('role_ids'); $projectRoles = $project->roles()->whereIn('id', $roleIds)->get(); $permission->roles()->attach($projectRoles); } return response()->json($permission, 201); } public function update(Request $request, Project $project, ProjectPermission $permission) { $validatedData = $request->validate([ 'name' => 'required|string|max:255', 'description' => 'nullable|string', ]); $permission->update($validatedData); // Оновлюємо прив'язку до ролей if ($request->has('role_ids')) { $roleIds = $request->input('role_ids'); $projectRoles = $project->roles()->whereIn('id', $roleIds)->get(); $permission->roles()->sync($projectRoles); } return response()->json($permission); } public function destroy(Project $project, ProjectPermission $permission) { // Перевіряємо, чи пов'язаний цей дозвіл з даним проектом $isAssociatedWithProject = $permission->roles() ->where('project_id', $project->id) ->exists(); if (!$isAssociatedWithProject) { return response()->json(['error' => 'Permission not found in this project'], 404); } // Від'єднуємо дозвіл від усіх ролей цього проекту $permission->roles()->wherePivot('project_id', $project->id)->detach(); // Якщо дозвіл більше не пов'язаний з жодною роллю в жодному проекті, видаляємо його if (!$permission->roles()->exists()) { $permission->delete(); } return response()->json(null, 204); } } |
Цей контролер забезпечує основні операції для управління правами доступу в контексті конкретного проекту. Зверніть увагу на те, як ми враховуємо мультитенантність у кожному методі.