$normalizedType, 'message' => $message, ]; } /** * Returns and clears all queued flash entries (typed queue + legacy key/value map). * * @return list */ public static function all(): array { $entries = []; if (isset($_SESSION[self::QUEUE_KEY]) && is_array($_SESSION[self::QUEUE_KEY])) { foreach ($_SESSION[self::QUEUE_KEY] as $entry) { if (!is_array($entry)) { continue; } $type = is_string($entry['type'] ?? null) ? $entry['type'] : 'info'; $message = is_string($entry['message'] ?? null) ? $entry['message'] : ''; if ($message === '') { continue; } if (!in_array($type, self::ALLOWED_TYPES, true)) { $type = 'info'; } $entries[] = ['type' => $type, 'message' => $message]; } unset($_SESSION[self::QUEUE_KEY]); } if (isset($_SESSION[self::FLASH_KEY]) && is_array($_SESSION[self::FLASH_KEY])) { foreach ($_SESSION[self::FLASH_KEY] as $key => $value) { if (!is_string($value) || $value === '') { continue; } $entries[] = [ 'type' => self::inferTypeFromKey((string) $key), 'message' => $value, ]; } unset($_SESSION[self::FLASH_KEY]); } return $entries; } private static function inferTypeFromKey(string $key): string { $lower = strtolower($key); if (str_contains($lower, 'error') || str_contains($lower, 'fail') || str_contains($lower, 'danger')) { return 'danger'; } if (str_contains($lower, 'warning') || str_contains($lower, 'warn')) { return 'warning'; } if ( str_contains($lower, 'success') || str_ends_with($lower, '.save') || str_contains($lower, 'saved') || str_contains($lower, '.created') || str_contains($lower, '.deleted') || str_contains($lower, '.toggled') ) { return 'success'; } return 'info'; } }