Skip to content
Advertisement

Laravel pagination pretty URL

Is there a way to get a pagination pretty URL in Laravel 4?

For example, by default:

http://example.com/something/?page=3

And what I would like to get:

http://example.com/something/page/3

Also, the pagination should render this way, and appending to the pagination should appear in this way.

Advertisement

Answer

Here’s a hacky workaround. I am using Laravel v4.1.23. It assumes page number is the last bit of your url. Haven’t tested it deeply so I’m interested in any bugs people can find. I’m even more interested in a better solution 🙂

Route:

Route::get('/articles/page/{page_number?}', function($page_number=1){
    $per_page = 1;
    Articles::resolveConnection()->getPaginator()->setCurrentPage($page_number);
    $articles = Articles::orderBy('created_at', 'desc')->paginate($per_page);
    return View::make('pages/articles')->with('articles', $articles);
});

View:

<?php
    $links = $articles->links();
    $patterns = array();
    $patterns[] = '/'.$articles->getCurrentPage().'?page=/';
    $replacements = array();
    $replacements[] = '';
    echo preg_replace($patterns, $replacements, $links);
?>

Model:

<?php
class Articles extends Eloquent {
    protected $table = 'articles';
}

Migration:

<?php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateArticlesTable extends Migration {

    public function up()
    {
        Schema::create('articles', function($table){
            $table->increments('id');
            $table->string('slug');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('articles');
    }
}

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement