Passed
Push — master ( fabbdf...3d1055 )
by Aleksei
06:01 queued 12s
created

PaginationFactory::createPaginator()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 17
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 7
nc 3
nop 2
dl 0
loc 17
ccs 8
cts 8
cp 1
crap 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Spiral\Http;
6
7
use Psr\Container\ContainerInterface;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Spiral\Core\Attribute\Scope;
10
use Spiral\Core\Exception\ScopeException;
11
use Spiral\Core\FactoryInterface;
12
use Spiral\Framework\Spiral;
13
use Spiral\Pagination\PaginationProviderInterface;
14
use Spiral\Pagination\Paginator;
15
use Spiral\Pagination\PaginatorInterface;
16
17
/**
18
 * Paginators factory binded to active request scope in order to select page number.
19
 */
20
#[Scope(Spiral::HttpRequest)]
21
final class PaginationFactory implements PaginationProviderInterface
22
{
23 4
    public function __construct(
24
        private readonly ContainerInterface $container,
25
        private readonly FactoryInterface $factory,
26 4
    ) {}
27
28
    /**
29
     * @throws ScopeException When no request are available.
30
     */
31 3
    public function createPaginator(string $parameter, int $limit = 25): PaginatorInterface
32
    {
33 3
        if (!$this->container->has(ServerRequestInterface::class)) {
34 1
            throw new ScopeException('Unable to create paginator, no request scope found');
35
        }
36
        /**
37
         * @var array $query
38
         */
39 2
        $query = $this->container->get(ServerRequestInterface::class)->getQueryParams();
40
41
        //Getting page number
42 2
        $page = 0;
43 2
        if (!empty($query[$parameter]) && \is_scalar($query[$parameter])) {
44 1
            $page = (int) $query[$parameter];
45
        }
46
47 2
        return $this->factory->make(Paginator::class, ['limit' => $limit, 'parameter' => $parameter])->withPage($page);
48
    }
49
}
50