Installation:
composer require anh/paginator:0.2.*
Basic Usage: For Eloquent queries or QueryBuilder:
use Anh\Paginator\Paginator;
$paginator = new Paginator();
$users = $paginator->paginate(User::query(), 1, 10); // Page 1, 10 items per page
For arrays:
$data = [/* array data */];
$paginatedData = $paginator->paginate($data, 1, 10);
First Use Case: Render paginated results in a Blade view:
return view('users.index', ['users' => $users]);
Then in Blade:
@foreach($users as $user)
{{ $user->name }}
@endforeach
Query-Based Pagination:
// Eloquent
$posts = $paginator->paginate(Post::query()->where('published', true), $page, 15);
// QueryBuilder
$posts = $paginator->paginate(DB::table('posts')->where('status', 'active'), $page, 15);
Array-Based Pagination:
$items = $paginator->paginate($arrayData, $page, 20, ['preserveKeys' => true]);
Custom Adapter Integration:
$adapterResolver = new AdapterResolver();
$adapterResolver->addAdapter(\App\CustomAdapter::class);
$paginator = new Paginator($adapterResolver);
View Rendering:
$view = new AdaptiveView();
$view->setTemplates([
'default' => resource_path('views/pagination/default.blade.php'),
]);
echo $view->render($posts, route('posts.index', ['page' => '%page%']));
Laravel Service Provider: Bind the paginator to the container for dependency injection:
$this->app->singleton(Paginator::class, function ($app) {
return new Paginator(new AdapterResolver());
});
Middleware for Page Validation:
Validate $page parameter in route middleware:
public function handle($request, Closure $next)
{
$page = (int) $request->query('page', 1);
if ($page < 1) abort(400, 'Invalid page number');
return $next($request);
}
Dynamic Per-Page Limits: Use request input for flexible limits:
$perPage = (int) $request->input('per_page', config('pagination.per_page', 15));
$items = $paginator->paginate($data, $page, $perPage);
Adapter Auto-Detection:
ArrayAdapter for arrays, DoctrineOrmAdapter for Doctrine queries).Anh\Paginator\Adapter\ArrayAdapter in composer.json, the paginator will fail silently or throw an error.Page Number Handling:
page starts at 1 (not 0). Passing 0 or negative values may cause unexpected behavior.page parameter:
$page = max(1, (int) $request->query('page'));
Doctrine ORM Adapter:
doctrine/orm). If not installed, the adapter will fail.composer.json:
"require": {
"doctrine/orm": "^2.0"
}
Array Key Preservation:
ArrayAdapter does not preserve keys by default. Use the preserveKeys option:
$paginator->paginate($array, $page, $limit, ['preserveKeys' => true]);
Adapter Resolution Issues:
AdapterResolver:
$adapterResolver = $paginator->getAdapterResolver();
$adapter = $adapterResolver->resolveAdapter($data);
if (!$adapter) {
throw new \RuntimeException('No adapter found for data type: ' . gettype($data));
}
View Rendering Errors:
$view->setTemplates([
'default' => __DIR__ . '/../resources/views/pagination/default.blade.php',
]);
Custom Adapters:
Anh\Paginator\Adapter\AdapterInterface:
class MyCustomAdapter implements AdapterInterface
{
public function paginate($data, $page, $limit, array $options = [])
{
// Custom logic here
return new Page($data, $page, $limit, $totalItems);
}
}
AdapterResolver:
$adapterResolver->addAdapter(MyCustomAdapter::class);
Custom Views:
Anh\Paginator\View\AdaptiveView to add custom templates or logic:
class CustomView extends AdaptiveView
{
protected function getDefaultTemplate()
{
return 'custom::pagination.default';
}
}
Page Class Extensions:
Anh\Paginator\Page to add custom methods or properties:
class CustomPage extends Page
{
public function getUrl($page)
{
return route('custom.route', ['page' => $page]);
}
}
$paginator->setPageClass(CustomPage::class);
Default Values:
per_page). Set these in your application:
config(['pagination.per_page' => 15]);
URL Generation:
AdaptiveView uses %page% as a placeholder. Customize this in your templates or override the generateUrl method.CSS Integration:
pagination.css is Foundation-based. Override or extend it to match your project’s styles:
/* Custom styles */
.pagination {
@apply text-center;
}
How can I help you explore Laravel packages today?