Laravel pagination pretty URL

Tags: , ,



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.

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');
    }
}


Source: stackoverflow