2014-01-07 6 views
16

Laravel 4にページングのかなりのURLを取得する方法はありますか?LaravelページングのきれいなURL

たとえば、デフォルトでは:

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

そして、何私が取得したいと思います:

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

また、改ページがこのようにレンダリングする必要があり、改ページに追加すると、この中に表示されます方法。

答えて

14

ここでハック回避策があります。私はLaravel v4.1.23を使用しています。ページ番号があなたのURLの最後のビットであると仮定します。深くテストしていないので、人々が見つけることができるバグに興味があります。 Iよりよい解決策に:-)

ルート一層興味:

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

ビュー:

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

モデル:

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

移行:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

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

これを動作させるには、多少面白いルーティングを行うことができます。ドキュメントhereから採取

Route::get('something/{page}', function($page) 
{ 
    // 
}) 
->where('page', '[0-9]+'); 

この例:どこかのラインに沿っ。

+0

それはページネータのリンクを溶液用 – Adam

0

私がこれを行うと考えることができる唯一の方法は、マッチングを行うためにPaginatorクラスを拡張することです。ただし、サードパーティのパッケージや他のクラス/ライブラリと競合する可能性があることを知っているだけです。現在のメソッドは、ほぼすべてのクラス/ライブラリ/パッケージで動作するように設計されています。

おそらく、あなたは次のことを試みることができる:

http://packalyst.com/packages/package/desmart/pagination( 'desmart' で 'ページネーション')

6

可能ですが、少しコードを書く必要があります。

まず、app/config/app.phpページネーション・サービス・プロバイダーに変更する必要がある - あなた自身を記述する必要があります。

コメント:

// 'Illuminate\Pagination\PaginationServiceProvider', 

とプロバイダセクションに

'Providers\PaginationServiceProvider', 

を追加します。

今、あなたはカスタムページネーションファクトリを使用するようにPaginationServiceProviderを作成する必要があります。

model/Providers/PaginationServiceProvider.phpファイル:あなたの上

<?php 

namespace Providers; 

use Illuminate\Support\ServiceProvider; 

class PaginationServiceProvider extends ServiceProvider 
{ 

    /** 
    * Indicates if loading of the provider is deferred. 
    * 
    * @var bool 
    */ 
    protected $defer = true; 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->bindShared('paginator', function ($app) { 
      $paginator = new PaginationFactory($app['request'], $app['view'], 
       $app['translator']); 

      $paginator->setViewName($app['config']['view.pagination']); 

      $app->refresh('request', $paginator, 'setRequest'); 

      return $paginator; 
     }); 
    } 

    /** 
    * Get the services provided by the provider. 
    * 
    * @return array 
    */ 
    public function provides() 
    { 
     return array('paginator'); 
    } 

} 

Providers\PaginationFactoryオブジェクトを作成し、今私たちは、このファイルを作成する必要があります。

model/providers/PaginationFactory.phpファイル:

<?php 


namespace Providers; 

use Illuminate\Pagination\Factory; 


class PaginationFactory extends Factory { 

    /** 
    * Get a new paginator instance. 
    * 
    * @param array $items 
    * @param int $total 
    * @param int|null $perPage 
    * @return \Illuminate\Pagination\Paginator 
    */ 
    public function make(array $items, $total, $perPage = null) 
    { 
     $paginator = new \Utils\Paginator($this, $items, $total, $perPage); 

     return $paginator->setupPaginationContext(); 
    }   
} 

はここだけ\Utils\Paginatorオブジェクトを作成しますので、今のは、それを作成してみましょう:

model/Utils/Paginator.phpファイル:我々は最終的に改ページのURLを作成するためのデフォルトのメソッドをオーバーライドし、このファイルに

<?php 

namespace Utils; 



class Paginator extends \Illuminate\Pagination\Paginator { 


    /** 
    * Get a URL for a given page number. 
    * 
    * @param int $page 
    * @return string 
    */ 
    public function getUrl($page) 
    { 
     $routeParameters = array(); 

     if ($page > 1) { // if $page == 1 don't add it to url 
     $routeParameters[$this->factory->getPageName()] = $page; 
     } 

     return \URL::route($this->factory->getCurrentUrl(), $routeParameters); 
    } 
} 

。 ( - しかし、あなたは別の方法で、もちろん、それを行うことができ、それが原因で上記のページネータの実装が重要です)あなたは私たちがここにasを使用してルート名を定義して見るように

Route::get('/categories/{page?}', 
    ['as' => 'categories', 
    'uses' => '[email protected]splayList' 
    ])->where('page', '[1-9]+[0-9]*'); 

あなたはルートがこのように定義されていると仮定しましょう。あなたが行うことができますCategoryControllerクラスのメソッドdisplayListで今

public function displayList($categories, $page = 1) // default 1 is needed here 
{ 
    Paginator::setCurrentPage($page); 
    Paginator::setBaseUrl('categories'); // use here route name and not the url 
    Paginator::setPageName('page'); 

    $categories = Category::paginate(15); 


    return View::make('admin.category')->with(
     ['categories' => $categories] 
    ); 
} 

ビューに追加:

<?php echo $categories->links(); ?> 

あなたがたURLをこのように生成されます:

http://localhost/categories 
http://localhost/categories/2 
http://localhost/categories/3 
http://localhost/categories/4 
http://localhost/categories/5 

なし?クエリ文字列

私の意見では、これはデフォルトで追加する必要があります。少なくとも、1つのクラスを拡張し、1つのメソッドを実装するために3つのクラスを作成するのに十分でなければなりません。

+0

おかげを変更しないであろう、I Laravelのいくつかのデフォルト関数をオーバーライドするのは本当に難しいです。新しいサービスプロバイダを作成する必要があります。何らかのオーバーライドジェネレータが必要です。 – Vedmant

1

これは誰かに役立つことを望む、私はモデルで使用される特性を作った。 アイデアは、このカスタムメソッドは、現在のルートを検出し、{ページ}パラメータの正しいセグメントの位置を使用するようにリンクを調整することができるということである。

https://gist.github.com/zofe/ced0054e6ac6eff1ea95

関連する問題