-
Notifications
You must be signed in to change notification settings - Fork 349
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #362 from Farrser/doctrine-paginator-adapter
Add DoctrinePaginatorAdapter to interface with Doctrine pagination
- Loading branch information
Showing
3 changed files
with
183 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
<?php | ||
/* | ||
* This file is part of the League\Fractal package. | ||
* | ||
* (c) Phil Sturgeon <me@philsturgeon.uk> | ||
* | ||
* For the full copyright and license information, please view the LICENSE | ||
* file that was distributed with this source code. | ||
*/ | ||
|
||
namespace League\Fractal\Pagination; | ||
|
||
use Doctrine\ORM\Tools\Pagination\Paginator; | ||
|
||
/** | ||
* A paginator adapter for doctrine pagination. | ||
* | ||
* @author Fraser Stockley <fraser.stockley@gmail.com> | ||
*/ | ||
class DoctrinePaginatorAdapter implements PaginatorInterface | ||
{ | ||
/** | ||
* The paginator instance. | ||
* @var Paginator | ||
*/ | ||
private $paginator; | ||
|
||
/** | ||
* The route generator. | ||
* | ||
* @var callable | ||
*/ | ||
private $routeGenerator; | ||
|
||
/** | ||
* Create a new DoctrinePaginatorAdapter. | ||
* @param Paginator $paginator | ||
* @param callable $routeGenerator | ||
* | ||
*/ | ||
public function __construct(Paginator $paginator, callable $routeGenerator) | ||
{ | ||
$this->paginator = $paginator; | ||
$this->routeGenerator = $routeGenerator; | ||
} | ||
|
||
/** | ||
* Get the current page. | ||
* | ||
* @return int | ||
*/ | ||
public function getCurrentPage() | ||
{ | ||
return ($this->paginator->getQuery()->getFirstResult() / $this->paginator->getQuery()->getMaxResults()) + 1; | ||
} | ||
|
||
/** | ||
* Get the last page. | ||
* | ||
* @return int | ||
*/ | ||
public function getLastPage() | ||
{ | ||
return (int) ceil($this->getTotal() / $this->paginator->getQuery()->getMaxResults()); | ||
} | ||
|
||
/** | ||
* Get the total. | ||
* | ||
* @return int | ||
*/ | ||
public function getTotal() | ||
{ | ||
return count($this->paginator); | ||
} | ||
|
||
/** | ||
* Get the count. | ||
* | ||
* @return int | ||
*/ | ||
public function getCount() | ||
{ | ||
return $this->paginator->getIterator()->count(); | ||
} | ||
|
||
/** | ||
* Get the number per page. | ||
* | ||
* @return int | ||
*/ | ||
public function getPerPage() | ||
{ | ||
return $this->paginator->getQuery()->getMaxResults(); | ||
} | ||
|
||
/** | ||
* Get the url for the given page. | ||
* | ||
* @param int $page | ||
* | ||
* @return string | ||
*/ | ||
public function getUrl($page) | ||
{ | ||
return call_user_func($this->getRouteGenerator(), $page); | ||
} | ||
|
||
/** | ||
* Get the the route generator. | ||
* | ||
* @return callable | ||
*/ | ||
private function getRouteGenerator() | ||
{ | ||
return $this->routeGenerator; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
<?php | ||
namespace League\Fractal\Test\Pagination; | ||
|
||
use Doctrine\ORM\Query; | ||
use League\Fractal\Pagination\DoctrinePaginatorAdapter; | ||
use Mockery; | ||
|
||
class DoctrinePaginatorAdapterTest extends \PHPUnit_Framework_TestCase | ||
{ | ||
public function testPaginationAdapter() | ||
{ | ||
$total = 50; | ||
$count = 5; | ||
$perPage = 5; | ||
$currentPage = 2; | ||
$lastPage = 10; | ||
|
||
//Mock the doctrine paginator | ||
$paginator = Mockery::mock('Doctrine\ORM\Tools\Pagination\Paginator')->makePartial(); | ||
$paginator->shouldReceive('count')->andReturn($total); | ||
|
||
|
||
//Mock the query that the paginator is acting on | ||
$query = Mockery::mock('Doctrine\ORM\AbstractQuery'); | ||
$query->shouldReceive('getFirstResult')->andReturn(($currentPage - 1) * $perPage); | ||
$query->shouldReceive('getMaxResults')->andReturn($perPage); | ||
$paginator->shouldReceive('getQuery')->andReturn($query); | ||
|
||
//Mock the iterator of the paginator | ||
$iterator = Mockery::mock('IteratorAggregate'); | ||
$iterator->shouldReceive('count')->andReturn($count); | ||
$paginator->shouldReceive('getIterator')->andReturn($iterator); | ||
|
||
|
||
$adapter = new DoctrinePaginatorAdapter($paginator, function ($page) { | ||
return 'http://example.com/foo?page='.$page; | ||
}); | ||
|
||
$this->assertInstanceOf( | ||
'League\Fractal\Pagination\PaginatorInterface', | ||
$adapter | ||
); | ||
|
||
$this->assertSame($currentPage, $adapter->getCurrentPage()); | ||
$this->assertSame($lastPage, $adapter->getLastPage()); | ||
$this->assertSame($count, $adapter->getCount()); | ||
$this->assertSame($total, $adapter->getTotal()); | ||
$this->assertSame($perPage, $adapter->getPerPage()); | ||
$this->assertSame( | ||
'http://example.com/foo?page=1', | ||
$adapter->getUrl(1) | ||
); | ||
$this->assertSame( | ||
'http://example.com/foo?page=3', | ||
$adapter->getUrl(3) | ||
); | ||
} | ||
|
||
public function tearDown() | ||
{ | ||
Mockery::close(); | ||
} | ||
} |