Installation
composer require dmp/paginator-bundle
Add to config/app.php under providers:
DMP\PaginatorBundle\PaginatorServiceProvider::class,
Basic Usage
Inject the Paginator facade into your controller:
use DMP\PaginatorBundle\Facades\Paginator;
public function index()
{
$data = Model::all();
$paginatedData = Paginator::paginate($data, 10); // 10 items per page
return view('your.view', ['data' => $paginatedData]);
}
Blade Integration
Use the @paginate directive in your Blade template:
@paginate($data)
Pagination with Eloquent
$users = Paginator::paginate(User::query()->where('active', 1), 15);
Customizing Pagination Views Override default views by publishing assets:
php artisan vendor:publish --provider="DMP\PaginatorBundle\PaginatorServiceProvider"
Modify resources/views/vendor/paginator/ templates.
API Responses Return paginated JSON responses:
return response()->json(Paginator::toArray($paginatedData));
Dynamic Page Size
$pageSize = request('per_page', 10);
$paginated = Paginator::paginate($data, $pageSize);
Integration with Livewire/Alpine
// Livewire component
public $perPage = 10;
public $items;
public function mount()
{
$this->items = Paginator::paginate(Model::all(), $this->perPage);
}
View Publishing Required
vendor:publish) to customize them. Forgetting this will result in blank pagination controls.Query Builder vs. Collection
Model::query()), not a collection (e.g., Model::all()). Passing a collection will break pagination.Route Model Binding Conflicts
Route::model('user', User::class)), ensure the paginated data doesn’t interfere with binding logic. Use Paginator::toArray() for API responses to avoid issues.CSRF on Pagination Links
@csrf to your form or use:
Paginator::setCsrfToken(true); // Globally enable CSRF in links
Check Pagination Data Structure Dump the paginated result to verify structure:
dd(Paginator::paginate($data, 10)->toArray());
Expected keys: data, current_page, per_page, total, last_page.
Log Query Builder Debug the underlying query:
$query = User::query()->where('active', 1);
\Log::info($query->toSql(), $query->getBindings());
$paginated = Paginator::paginate($query, 10);
Override Default Config Publish config first:
php artisan vendor:publish --tag=paginator-config
Then modify config/paginator.php (e.g., change default_per_page).
Custom Pagination Views
Extend the default views by copying vendor/dmp/paginator-bundle/resources/views to resources/views/vendor/paginator/.
Add Custom Data to Pagination Attach metadata to the paginator instance:
$paginator = Paginator::paginate($data, 10);
$paginator->with(['custom_key' => 'value']);
Access in Blade:
{{ $data->custom_key }}
Modify Pagination URLs Override the URL generator via config:
'url_generator' => function ($paginator) {
return route('custom.pagination.route', ['page' => $paginator->currentPage()]);
},
Localization
The bundle uses Laravel’s localization. Override translation strings in resources/lang/{locale}/paginator.php.
How can I help you explore Laravel packages today?