Random thoughts

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.

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>.

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.