Backup #1907

ID1907
Dateipfad/var/www/dev.campus.systemische-tools.de/src/Domain/ValueObject/Pagination.php
Version5
Typ modified
Größe2.9 KB
Hashc714554713e36ed53f52d07ab42f1ca6bb1149b3063e5d531c187363066dd125
Datum2025-12-28 01:06:48
Geändert vonclaude-code-hook
GrundClaude Code Pre-Hook Backup vor Edit-Operation
Datei existiert Ja

Dateiinhalt

<?php

declare(strict_types=1);

namespace Domain\ValueObject;

// @responsibility: Pagination Value Object (immutable)

final class Pagination
{
    public function __construct(
        public readonly int $page,
        public readonly int $limit,
        public readonly int $offset,
        public readonly int $totalCount = 0
    ) {
    }

    /**
     * Create pagination from page and limit values.
     *
     * @param int $page Current page number (1-based)
     * @param int $limit Items per page
     * @param int $maxLimit Maximum allowed limit
     */
    public static function create(int $page = 1, int $limit = 50, int $maxLimit = 100): self
    {
        $page = max(1, $page);
        $limit = min($maxLimit, max(1, $limit));

        return new self($page, $limit, ($page - 1) * $limit);
    }

    /**
     * Create new instance with total count set.
     */
    public function withTotal(int $count): self
    {
        return new self($this->page, $this->limit, $this->offset, $count);
    }

    /**
     * Calculate total number of pages.
     */
    public function totalPages(): int
    {
        if ($this->totalCount === 0) {
            return 0;
        }

        return (int) ceil($this->totalCount / $this->limit);
    }

    /**
     * Check if there is a next page.
     */
    public function hasNextPage(): bool
    {
        return $this->page < $this->totalPages();
    }

    /**
     * Check if there is a previous page.
     */
    public function hasPrevPage(): bool
    {
        return $this->page > 1;
    }

    /**
     * Get next page number (or current if at last page).
     */
    public function nextPage(): int
    {
        return $this->hasNextPage() ? $this->page + 1 : $this->page;
    }

    /**
     * Get previous page number (or 1 if at first page).
     */
    public function prevPage(): int
    {
        return $this->hasPrevPage() ? $this->page - 1 : 1;
    }

    /**
     * Get range of visible page numbers for pagination UI.
     *
     * @param int $range Number of pages to show around current page
     * @return array<int>
     */
    public function getPageRange(int $range = 2): array
    {
        $totalPages = $this->totalPages();

        if ($totalPages === 0) {
            return [];
        }

        $start = max(1, $this->page - $range);
        $end = min($totalPages, $this->page + $range);

        return range($start, $end);
    }

    /**
     * Convert to array for template usage.
     *
     * @return array{page: int, limit: int, offset: int, totalCount: int, totalPages: int, hasNext: bool, hasPrev: bool}
     */
    public function toArray(): array
    {
        return [
            'page' => $this->page,
            'limit' => $this->limit,
            'offset' => $this->offset,
            'totalCount' => $this->totalCount,
            'totalPages' => $this->totalPages(),
            'hasNext' => $this->hasNextPage(),
            'hasPrev' => $this->hasPrevPage(),
        ];
    }
}

Vollständig herunterladen

Aktionen

Herunterladen

Andere Versionen dieser Datei

ID Version Typ Größe Datum
1910 6 modified 2.9 KB 2025-12-28 01:07
1907 5 modified 2.9 KB 2025-12-28 01:06
815 4 modified 3.0 KB 2025-12-23 08:08
639 3 modified 4.5 KB 2025-12-23 04:47
638 2 modified 3.8 KB 2025-12-23 04:46
635 1 modified 3.0 KB 2025-12-23 04:45

← Zurück zur Übersicht