cakephp orm and illuminate pagination
Do you know CakePHP version 3 has a lovely ORM which can be used as standalone?
Thank you José Lorenzo Rodríguez and every contributor, for your hard work.
composer require cakephp/orm
That's it.
Working on I noticed I need to do some pagination. Oh, remember we have illuminate/pagination. Why not use it?
Problem, there seems no one have implemented it. How could we achieve it? Lets do it.
composer require illuminate/pagination
If you are using a psr-7 request / response here is the middleware for you.
<?php
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Illuminate\Pagination\Paginator as IlluminatePaginator;
class PaginatorMiddleware
{
    public function __invoke( ServerRequestInterface $request, ResponseInterface $response, callable $next = null )
    {
        IlluminatePaginator::currentPageResolver(function ( $pageName = 'page' ) use($request )
        {
            $params = $request->getQueryParams();
            return empty($params[$pageName]) ? 1 : $params[$pageName];
        });
        IlluminatePaginator::currentPathResolver(function () use($request )
        {
            return $request->getUri()->getPath();
        });
        return $next($request, $response);
    }
}
What we did above are a few things for Illuminate to give the url path when
it is doing the pagination. So for example /article?page=<page-number> will come
instead of just ?page=<page-number>.
<?php
use Cake\ORM\TableRegistry;
use Illuminate\Pagination\Paginator;
use Illuminate\Pagination\LengthAwarePaginator;
$table = TableRegistry::get('Articles');
$currentPage = 1;
$perPage = 20;
$query = $table->find('all');
$total = $query->count();
$items = $query->page($currentPage, $perPage);
$paginator = new LengthAwarePaginator($items, $total, $perPage, $currentPage, [
	'path' => Paginator::resolveCurrentPath(),
]);
echo $paginator->render();
The above code is querying the articles and rendering the pagination with the returned results.
By default the Presenter is Illuminate\Pagination\BootstrapThreePresenter, but you
can create your own.
I hope you will love the integration.
Thank you everyone for your support and hard work on components to make PHP better every day.
