Skip to content

Commit 348adcc

Browse files
committed
Add PHPStan type annotations for pagination classes
- Add Media type hints to array properties and parameters - Fix missing iterable value type specifications - Ensures PHPStan level compliance
1 parent 76e6416 commit 348adcc

File tree

10 files changed

+61
-19
lines changed

10 files changed

+61
-19
lines changed

src/Bridge/EasyAdmin/config/services.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
use JoliCode\MediaBundle\Bridge\EasyAdmin\Config\Config;
77
use JoliCode\MediaBundle\Bridge\EasyAdmin\Controller\MediaAdminController;
88
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\DataTransformer\MediaTransformer;
9-
use JoliCode\MediaBundle\Bridge\EasyAdmin\Paginator\MediaPaginator;
109
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\MediaChoiceType;
1110
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\UploadType;
11+
use JoliCode\MediaBundle\Bridge\EasyAdmin\Paginator\MediaPaginator;
1212
use JoliCode\MediaBundle\Bridge\Security\Voter\MediaVoter;
1313
use JoliCode\MediaBundle\Bridge\Twig\JoliMediaAdminExtension;
1414

src/Bridge/EasyAdmin/src/Controller/MediaAdminController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
88
use JoliCode\MediaBundle\Bridge\EasyAdmin\Config\Config;
99
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\CreateDirectoryType;
10-
use JoliCode\MediaBundle\Bridge\EasyAdmin\Paginator\MediaPaginator;
1110
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\DeleteDirectoryType;
1211
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\DeleteType;
1312
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\MoveType;
1413
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\RenameDirectoryType;
1514
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\RenameType;
1615
use JoliCode\MediaBundle\Bridge\EasyAdmin\Form\Type\UploadType;
16+
use JoliCode\MediaBundle\Bridge\EasyAdmin\Paginator\MediaPaginator;
1717
use JoliCode\MediaBundle\Bridge\Security\Voter\AdminAction;
1818
use JoliCode\MediaBundle\Conversion\Converter;
1919
use JoliCode\MediaBundle\Exception\ForbiddenPathException;

src/Bridge/EasyAdmin/src/Paginator/MediaPaginator.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace JoliCode\MediaBundle\Bridge\EasyAdmin\Paginator;
44

55
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
6+
use JoliCode\MediaBundle\Model\Media;
67

78
/**
89
* Paginator adapter for media files to work with EasyAdmin's pagination template.
@@ -12,17 +13,28 @@
1213
class MediaPaginator
1314
{
1415
private int $currentPage;
16+
1517
private int $pageSize;
18+
1619
private int $numResults;
20+
21+
/**
22+
* @var array<Media>
23+
*/
1724
private array $results;
25+
1826
private string $routeName;
27+
1928
private string $currentKey;
2029

2130
public function __construct(
2231
private readonly AdminUrlGenerator $adminUrlGenerator,
2332
) {
2433
}
2534

35+
/**
36+
* @param array{items: array<Media>, total: int, page: int, perPage: int} $paginationData
37+
*/
2638
public function paginate(array $paginationData, string $routeName, string $currentKey): self
2739
{
2840
$this->currentPage = $paginationData['page'];
@@ -40,7 +52,8 @@ public function generateUrlForPage(int $page): string
4052
return $this->adminUrlGenerator
4153
->setRoute($this->routeName, ['key' => $this->currentKey])
4254
->set('page', $page)
43-
->generateUrl();
55+
->generateUrl()
56+
;
4457
}
4558

4659
public function getCurrentPage(): int
@@ -61,8 +74,8 @@ public function getLastPage(): int
6174
*/
6275
public function getPageRange(?int $pagesOnEachSide = null, ?int $pagesOnEdges = null): iterable
6376
{
64-
$pagesOnEachSide = $pagesOnEachSide ?? 2;
65-
$pagesOnEdges = $pagesOnEdges ?? 1;
77+
$pagesOnEachSide ??= 2;
78+
$pagesOnEdges ??= 1;
6679

6780
$lastPage = $this->getLastPage();
6881
$currentPage = $this->currentPage;
@@ -82,6 +95,7 @@ public function getPageRange(?int $pagesOnEachSide = null, ?int $pagesOnEdges =
8295
for ($i = 1; $i <= $pagesOnEdges; ++$i) {
8396
$pages[] = $i;
8497
}
98+
8599
// Add ellipsis if there's a gap
86100
if ($startPage > $pagesOnEdges + 2) {
87101
$pages[] = null;
@@ -107,6 +121,7 @@ public function getPageRange(?int $pagesOnEachSide = null, ?int $pagesOnEdges =
107121
} elseif ($endPage === $lastPage - $pagesOnEdges - 1) {
108122
$pages[] = $lastPage - $pagesOnEdges;
109123
}
124+
110125
for ($i = $lastPage - $pagesOnEdges + 1; $i <= $lastPage; ++$i) {
111126
$pages[] = $i;
112127
}
@@ -154,6 +169,9 @@ public function getNumResults(): int
154169
return $this->numResults;
155170
}
156171

172+
/**
173+
* @return array<Media>
174+
*/
157175
public function getResults(): array
158176
{
159177
return $this->results;

src/Bridge/EasyAdmin/templates/list.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@
118118
{% endif %}
119119

120120
{% if paginator is defined and paginator.hasToPaginate %}
121-
{% include '@EasyAdmin/crud/paginator.html.twig' %}
121+
{{ include('@EasyAdmin/crud/paginator.html.twig') }}
122122
{% endif %}
123123
</div>
124124
{% endblock %}

src/Bridge/SonataAdmin/config/services.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
use JoliCode\MediaBundle\Bridge\SonataAdmin\Config\Config;
88
use JoliCode\MediaBundle\Bridge\SonataAdmin\Controller\MediaAdminController;
99
use JoliCode\MediaBundle\Bridge\SonataAdmin\FieldDescription\TypeGuesser;
10-
use JoliCode\MediaBundle\Bridge\SonataAdmin\Pager\MediaPager;
1110
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\DataTransformer\MediaTransformer;
1211
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\MediaChoiceType;
1312
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\UploadType;
13+
use JoliCode\MediaBundle\Bridge\SonataAdmin\Pager\MediaPager;
1414
use JoliCode\MediaBundle\Bridge\Twig\JoliMediaAdminExtension;
1515

1616
return static function (ContainerConfigurator $container): void {

src/Bridge/SonataAdmin/src/Controller/MediaAdminController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
use JoliCode\MediaBundle\Bridge\Security\Voter\AdminAction;
66
use JoliCode\MediaBundle\Bridge\SonataAdmin\Config\Config;
77
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\CreateDirectoryType;
8-
use JoliCode\MediaBundle\Bridge\SonataAdmin\Pager\MediaPager;
98
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\DeleteDirectoryType;
109
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\DeleteType;
1110
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\MoveType;
1211
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\RenameDirectoryType;
1312
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\RenameType;
1413
use JoliCode\MediaBundle\Bridge\SonataAdmin\Form\Type\UploadType;
14+
use JoliCode\MediaBundle\Bridge\SonataAdmin\Pager\MediaPager;
1515
use JoliCode\MediaBundle\Conversion\Converter;
1616
use JoliCode\MediaBundle\Exception\ForbiddenPathException;
1717
use JoliCode\MediaBundle\Exception\MediaInUseException;

src/Bridge/SonataAdmin/src/Pager/MediaPager.php

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,46 @@
22

33
namespace JoliCode\MediaBundle\Bridge\SonataAdmin\Pager;
44

5+
use JoliCode\MediaBundle\Model\Media;
56
use Sonata\AdminBundle\Datagrid\PagerInterface;
67
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
78

89
/**
910
* Pager adapter for media files to work with Sonata Admin's pagination.
1011
* This adapter provides the same interface as Sonata's Pager
1112
* but works with array data instead of Doctrine entities.
13+
*
14+
* Note: This class implements PagerInterface which includes query-related methods
15+
* (getQuery/setQuery) that are not applicable for array-based pagination.
16+
* These methods are implemented as no-ops to satisfy the interface contract.
1217
*/
1318
class MediaPager implements PagerInterface
1419
{
1520
private int $page = 1;
21+
1622
private int $maxPerPage = 50;
23+
1724
private int $maxPageLinks = 7;
25+
1826
private int $countResults = 0;
27+
28+
/**
29+
* @var array<Media>
30+
*/
1931
private array $results = [];
32+
2033
private ?string $routeName = null;
34+
2135
private ?string $currentKey = null;
2236

2337
public function init(): void
2438
{
2539
// Nothing to initialize for array-based pagination
2640
}
2741

42+
/**
43+
* @param array{items: array<Media>, total: int, page: int, perPage: int} $paginationData
44+
*/
2845
public function paginate(array $paginationData, string $routeName, string $currentKey): self
2946
{
3047
$this->page = $paginationData['page'];
@@ -74,7 +91,7 @@ public function getFirstPage(): int
7491

7592
public function isFirstPage(): bool
7693
{
77-
return $this->page === 1;
94+
return 1 === $this->page;
7895
}
7996

8097
public function getLastPage(): int
@@ -89,13 +106,20 @@ public function isLastPage(): bool
89106

90107
public function getQuery(): ?ProxyQueryInterface
91108
{
92-
// Not applicable for array-based pagination
93109
return null;
94110
}
95111

112+
/**
113+
* {@inheritdoc}
114+
*
115+
* Note: This method is a no-op as this pager works with array data, not database queries.
116+
* MediaPager uses array-based pagination and does not work with ProxyQueryInterface.
117+
*
118+
* @throws \LogicException if called (optional: you can add this exception for fail-fast behavior)
119+
*/
96120
public function setQuery(ProxyQueryInterface $query): void
97121
{
98-
// Not applicable for array-based pagination
122+
// No-op: MediaPager uses array-based pagination, not database queries
99123
}
100124

101125
public function haveToPaginate(): bool

src/Bridge/SonataAdmin/templates/Pager/links.html.twig

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ Adapted from Sonata Admin's base_links.html.twig
55
<div class="text-center">
66
<ul class="pagination">
77
{% if pager.page > 2 %}
8-
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: 1 }) }}" title="{{ 'link_first_pager'|trans({}, 'SonataAdminBundle') }}">&laquo;</a></li>
8+
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: 1 }) }}" title="{{ 'link_first_pager'|trans({ }, 'SonataAdminBundle') }}">&laquo;</a></li>
99
{% endif %}
1010

1111
{% if pager.page != pager.previousPage %}
12-
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: pager.previousPage }) }}" title="{{ 'link_previous_pager'|trans({}, 'SonataAdminBundle') }}">&lsaquo;</a></li>
12+
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: pager.previousPage }) }}" title="{{ 'link_previous_pager'|trans({ }, 'SonataAdminBundle') }}">&lsaquo;</a></li>
1313
{% endif %}
1414

1515
{% for page in pager.getLinks(7) %}
@@ -21,11 +21,11 @@ Adapted from Sonata Admin's base_links.html.twig
2121
{% endfor %}
2222

2323
{% if pager.page != pager.nextPage %}
24-
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: pager.nextPage }) }}" title="{{ 'link_next_pager'|trans({}, 'SonataAdminBundle') }}">&rsaquo;</a></li>
24+
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: pager.nextPage }) }}" title="{{ 'link_next_pager'|trans({ }, 'SonataAdminBundle') }}">&rsaquo;</a></li>
2525
{% endif %}
2626

2727
{% if pager.page != pager.lastPage and pager.lastPage != pager.nextPage %}
28-
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: pager.lastPage }) }}" title="{{ 'link_last_pager'|trans({}, 'SonataAdminBundle') }}">&raquo;</a></li>
28+
<li><a href="{{ path(pager.routeName, { key: pager.currentKey, page: pager.lastPage }) }}" title="{{ 'link_last_pager'|trans({ }, 'SonataAdminBundle') }}">&raquo;</a></li>
2929
{% endif %}
3030
</ul>
3131
</div>

src/Bridge/SonataAdmin/templates/Pager/results.html.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ Results count for media library
33
#}
44
<div class="box-footer clearfix">
55
<div class="pull-left">
6-
{% trans with {'%count%': pager.countResults()} from 'SonataAdminBundle' %}list_results_count{% endtrans %}
6+
{% trans with { '%count%': pager.countResults() } from 'SonataAdminBundle' %}list_results_count{% endtrans %}
77
</div>
88
<div class="pull-right">
9-
{% include '@JoliMediaSonataAdmin/Pager/links.html.twig' %}
9+
{{ include('@JoliMediaSonataAdmin/Pager/links.html.twig') }}
1010
</div>
1111
</div>

src/Bridge/SonataAdmin/templates/list.html.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@
159159
</table>
160160
</div>
161161
{% if pager is defined and pager.haveToPaginate() %}
162-
{% include '@JoliMediaSonataAdmin/Pager/results.html.twig' %}
162+
{{ include('@JoliMediaSonataAdmin/Pager/results.html.twig') }}
163163
{% endif %}
164164
</div>
165165
{% else %}
@@ -194,7 +194,7 @@
194194
</ul>
195195
{% if pager is defined and pager.haveToPaginate() %}
196196
<div class="box box-primary">
197-
{% include '@JoliMediaSonataAdmin/Pager/results.html.twig' %}
197+
{{ include('@JoliMediaSonataAdmin/Pager/results.html.twig') }}
198198
</div>
199199
{% endif %}
200200
{% endif %}

0 commit comments

Comments
 (0)