{
"event": "PreToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Domain\/ValueObject\/Pagination.php",
"old_string": " \/**\n * Create pagination from request parameters.\n * Note: Controllers should use create() with their own parameter extraction.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\n * @deprecated Use create() instead with explicit parameters\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n \/\/ Get values from request - this is a temporary compatibility layer\n $page = max(1, (int) filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1);\n $limit = (int) filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT) ?: $defaultLimit;\n $limit = min($maxLimit, max(1, $limit));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }",
"new_string": " \/**\n * Create pagination using RequestParams provider.\n * This is infrastructure-agnostic by accepting a callable.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n * @param callable(string, int): int $paramProvider Function to get int params\n *\/\n public static function fromParams(\n int $defaultLimit = 50,\n int $maxLimit = 100,\n ?callable $paramProvider = null\n ): self {\n \/\/ Default provider uses global request context if no provider given\n if ($paramProvider === null) {\n $paramProvider = static function (string $key, int $default): int {\n return $default;\n };\n }\n\n $page = max(1, $paramProvider('page', 1));\n $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination from request parameters.\n * Convenience method for controllers.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {\n $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);\n\n return $value !== false && $value !== null ? $value : $default;\n });\n }"
}
}
{
"tool_response": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/Domain\/ValueObject\/Pagination.php",
"oldString": " \/**\n * Create pagination from request parameters.\n * Note: Controllers should use create() with their own parameter extraction.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\n * @deprecated Use create() instead with explicit parameters\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n \/\/ Get values from request - this is a temporary compatibility layer\n $page = max(1, (int) filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1);\n $limit = (int) filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT) ?: $defaultLimit;\n $limit = min($maxLimit, max(1, $limit));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }",
"newString": " \/**\n * Create pagination using RequestParams provider.\n * This is infrastructure-agnostic by accepting a callable.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n * @param callable(string, int): int $paramProvider Function to get int params\n *\/\n public static function fromParams(\n int $defaultLimit = 50,\n int $maxLimit = 100,\n ?callable $paramProvider = null\n ): self {\n \/\/ Default provider uses global request context if no provider given\n if ($paramProvider === null) {\n $paramProvider = static function (string $key, int $default): int {\n return $default;\n };\n }\n\n $page = max(1, $paramProvider('page', 1));\n $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination from request parameters.\n * Convenience method for controllers.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {\n $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);\n\n return $value !== false && $value !== null ? $value : $default;\n });\n }",
"originalFile": "<?php\n\nnamespace Domain\\ValueObject;\n\n\/**\n * Pagination Value Object for consistent pagination handling.\n *\n * Immutable object that encapsulates pagination logic.\n * Use fromRequest() for creating from HTTP request parameters.\n *\/\nfinal class Pagination\n{\n public function __construct(\n public readonly int $page,\n public readonly int $limit,\n public readonly int $offset,\n public readonly int $totalCount = 0\n ) {\n }\n\n \/**\n * Create pagination from page and limit values.\n *\n * @param int $page Current page number (1-based)\n * @param int $limit Items per page\n * @param int $maxLimit Maximum allowed limit\n *\/\n public static function create(int $page = 1, int $limit = 50, int $maxLimit = 100): self\n {\n $page = max(1, $page);\n $limit = min($maxLimit, max(1, $limit));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create pagination from request parameters.\n * Note: Controllers should use create() with their own parameter extraction.\n *\n * @param int $defaultLimit Default items per page\n * @param int $maxLimit Maximum allowed limit\n *\n * @deprecated Use create() instead with explicit parameters\n *\/\n public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self\n {\n \/\/ Get values from request - this is a temporary compatibility layer\n $page = max(1, (int) filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1);\n $limit = (int) filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT) ?: $defaultLimit;\n $limit = min($maxLimit, max(1, $limit));\n\n return new self($page, $limit, ($page - 1) * $limit);\n }\n\n \/**\n * Create new instance with total count set.\n *\/\n public function withTotal(int $count): self\n {\n return new self($this->page, $this->limit, $this->offset, $count);\n }\n\n \/**\n * Calculate total number of pages.\n *\/\n public function totalPages(): int\n {\n if ($this->totalCount === 0) {\n return 0;\n }\n\n return (int) ceil($this->totalCount \/ $this->limit);\n }\n\n \/**\n * Check if there is a next page.\n *\/\n public function hasNextPage(): bool\n {\n return $this->page < $this->totalPages();\n }\n\n \/**\n * Check if there is a previous page.\n *\/\n public function hasPrevPage(): bool\n {\n return $this->page > 1;\n }\n\n \/**\n * Get next page number (or current if at last page).\n *\/\n public function nextPage(): int\n {\n return $this->hasNextPage() ? $this->page + 1 : $this->page;\n }\n\n \/**\n * Get previous page number (or 1 if at first page).\n *\/\n public function prevPage(): int\n {\n return $this->hasPrevPage() ? $this->page - 1 : 1;\n }\n\n \/**\n * Get range of visible page numbers for pagination UI.\n *\n * @param int $range Number of pages to show around current page\n * @return array<int>\n *\/\n public function getPageRange(int $range = 2): array\n {\n $totalPages = $this->totalPages();\n\n if ($totalPages === 0) {\n return [];\n }\n\n $start = max(1, $this->page - $range);\n $end = min($totalPages, $this->page + $range);\n\n return range($start, $end);\n }\n\n \/**\n * Convert to array for template usage.\n *\n * @return array{page: int, limit: int, offset: int, totalCount: int, totalPages: int, hasNext: bool, hasPrev: bool}\n *\/\n public function toArray(): array\n {\n return [\n 'page' => $this->page,\n 'limit' => $this->limit,\n 'offset' => $this->offset,\n 'totalCount' => $this->totalCount,\n 'totalPages' => $this->totalPages(),\n 'hasNext' => $this->hasNextPage(),\n 'hasPrev' => $this->hasPrevPage(),\n ];\n }\n}\n",
"structuredPatch": [
{
"oldStart": 34,
"oldLines": 22,
"newStart": 34,
"newLines": 45,
"lines": [
" }",
" ",
" \/**",
"- * Create pagination from request parameters.",
"- * Note: Controllers should use create() with their own parameter extraction.",
"+ * Create pagination using RequestParams provider.",
"+ * This is infrastructure-agnostic by accepting a callable.",
" *",
" * @param int $defaultLimit Default items per page",
" * @param int $maxLimit Maximum allowed limit",
"+ * @param callable(string, int): int $paramProvider Function to get int params",
"+ *\/",
"+ public static function fromParams(",
"+ int $defaultLimit = 50,",
"+ int $maxLimit = 100,",
"+ ?callable $paramProvider = null",
"+ ): self {",
"+ \/\/ Default provider uses global request context if no provider given",
"+ if ($paramProvider === null) {",
"+ $paramProvider = static function (string $key, int $default): int {",
"+ return $default;",
"+ };",
"+ }",
"+",
"+ $page = max(1, $paramProvider('page', 1));",
"+ $limit = min($maxLimit, max(1, $paramProvider('limit', $defaultLimit)));",
"+",
"+ return new self($page, $limit, ($page - 1) * $limit);",
"+ }",
"+",
"+ \/**",
"+ * Create pagination from request parameters.",
"+ * Convenience method for controllers.",
" *",
"- * @deprecated Use create() instead with explicit parameters",
"+ * @param int $defaultLimit Default items per page",
"+ * @param int $maxLimit Maximum allowed limit",
" *\/",
" public static function fromRequest(int $defaultLimit = 50, int $maxLimit = 100): self",
" {",
"- \/\/ Get values from request - this is a temporary compatibility layer",
"- $page = max(1, (int) filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT) ?: 1);",
"- $limit = (int) filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT) ?: $defaultLimit;",
"- $limit = min($maxLimit, max(1, $limit));",
"+ return self::fromParams($defaultLimit, $maxLimit, static function (string $key, int $default): int {",
"+ $value = filter_input(INPUT_GET, $key, FILTER_VALIDATE_INT);",
" ",
"- return new self($page, $limit, ($page - 1) * $limit);",
"+ return $value !== false && $value !== null ? $value : $default;",
"+ });",
" }",
" ",
" \/**"
]
}
],
"userModified": false,
"replaceAll": false
}
}