'boolean', 'grace_minutes' => 'integer', 'priority' => 'integer', 'scope' => IdentityPolicyScope::class, 'fail_mode' => IdentityPolicyFailMode::class, 'applies_to' => IdentityPolicyAppliesTo::class, 'source_type' => IdentityPolicySourceType::class, 'conditions' => 'array', 'user_overrides' => 'array', ]; } /** * Route scope 자동 매핑 캐시 키 — Repository::getRouteScopeIndex 가 사용. * 정책 CRUD 시 saved/deleted 이벤트로 즉시 invalidate 되어 다음 요청부터 새 정책 반영. * * 캐시 백엔드는 CoreCacheDriver(접두사 g7:core:) 를 통해 G7 표준 격리 적용. */ public const ROUTE_SCOPE_CACHE_KEY = 'identity_policies.route_scope_index'; /** * 캐시 무효화 태그 — Repository::getRouteScopeIndex 가 같은 태그로 등록하므로 * flushTags 한 번에 일괄 정리됨 (단일 키 forget 보다 향후 다중 캐시 키 확장에 안전). */ public const ROUTE_SCOPE_CACHE_TAG = 'identity_policy'; protected static function booted(): void { static::saved(static::flushRouteScopeCache(...)); static::deleted(static::flushRouteScopeCache(...)); } public static function flushRouteScopeCache(): void { $cache = app(\App\Contracts\Extension\CacheInterface::class); if ($cache->supportsTags()) { $cache->flushTags([self::ROUTE_SCOPE_CACHE_TAG]); return; } $cache->forget(self::ROUTE_SCOPE_CACHE_KEY); } }