Трейт є ключовим компонентом у нашій системі управління правами доступу. Він надає гнучкий спосіб додавання функціональності перевірки прав до різних моделей.
HasPermissions Trait
Створимо трейт HasPermissions:
|
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 |
<?php namespace App\Traits; use App\Models\ProjectPermission; trait HasPermissions { public function hasPermission($permission) { if (is_string($permission)) { return $this->permissions->contains('name', $permission); } return !!$permission->intersect($this->permissions)->count(); } public function hasPermissionTo($permission) { return $this->hasPermission($permission); } public function hasRole($role) { if (is_string($role)) { return $this->roles->contains('name', $role); } return !!$role->intersect($this->roles)->count(); } public function hasAnyPermission(...$permissions) { if (is_array($permissions[0])) { $permissions = $permissions[0]; } foreach ($permissions as $permission) { if ($this->hasPermission($permission)) { return true; } } return false; } public function getAllPermissions() { return $this->roles->flatMap->permissions->unique(); } } |
Використання трейту
Тепер ми можемо використовувати цей трейт у нашій моделі ProjectUser:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php namespace App\Models; use App\Traits\HasPermissions; use Illuminate\Database\Eloquent\Model; class ProjectUser extends Model { use HasPermissions; // ... інший код моделі public function permissions() { return $this->roles->flatMap->permissions; } } |
Приклад використання в контролері
|
1 2 3 4 5 6 7 8 9 10 |
public function update(Request $request, Project $project) { $user = $request->user()->projectUser($project); if (!$user->hasPermission('edit_project')) { return response()->json(['error' => 'Unauthorized'], 403); } // Логіка оновлення проекту } |
Цей трейт надає гнучкий і потужний спосіб управління правами доступу в нашій системі.