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