'datetime', 'password' => 'hashed', 'is_admin' => 'boolean', ]; } public function userPermissions(): HasMany { return $this->hasMany(UserPermission::class); } // Проверка права (eager-load relation один раз на запрос) public function hasPermission(string $permission): bool { if (! $this->relationLoaded('userPermissions')) { $this->load('userPermissions'); } return PermissionService::userCan($this, $permission); } // Может ли пользователь входить в админку public function isAdminUser(): bool { return (bool) $this->role || $this->is_admin; } // Может ли текущий пользователь управлять целевым public function canManage(self $target): bool { if ($this->role === 'superadmin') { return true; } if ($this->role === 'admin') { return ! in_array($target->role, ['superadmin', 'admin'], true); } return false; } public function roleBadge(): array { return PermissionService::roleLabels()[$this->role] ?? ['label' => 'Без роли', 'color' => 'secondary']; } protected static function newFactory(): UserFactory { return UserFactory::new(); } }