Laravel 4にページングのかなりのURLを取得する方法はありますか?LaravelページングのきれいなURL
たとえば、デフォルトでは:
http://example.com/something/?page=3
そして、何私が取得したいと思います:
http://example.com/something/page/3
また、改ページがこのようにレンダリングする必要があり、改ページに追加すると、この中に表示されます方法。
Laravel 4にページングのかなりのURLを取得する方法はありますか?LaravelページングのきれいなURL
たとえば、デフォルトでは:
http://example.com/something/?page=3
そして、何私が取得したいと思います:
http://example.com/something/page/3
また、改ページがこのようにレンダリングする必要があり、改ページに追加すると、この中に表示されます方法。
ここでハック回避策があります。私は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');
}
}
これを動作させるには、多少面白いルーティングを行うことができます。ドキュメントhereから採取
Route::get('something/{page}', function($page)
{
//
})
->where('page', '[0-9]+');
この例:どこかのラインに沿っ。
私がこれを行うと考えることができる唯一の方法は、マッチングを行うためにPaginatorクラスを拡張することです。ただし、サードパーティのパッケージや他のクラス/ライブラリと競合する可能性があることを知っているだけです。現在のメソッドは、ほぼすべてのクラス/ライブラリ/パッケージで動作するように設計されています。
おそらく、あなたは次のことを試みることができる:
http://packalyst.com/packages/package/desmart/pagination( 'desmart' で 'ページネーション')
可能ですが、少しコードを書く必要があります。
まず、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つのクラスを作成するのに十分でなければなりません。
おかげを変更しないであろう、I Laravelのいくつかのデフォルト関数をオーバーライドするのは本当に難しいです。新しいサービスプロバイダを作成する必要があります。何らかのオーバーライドジェネレータが必要です。 – Vedmant
これは誰かに役立つことを望む、私はモデルで使用される特性を作った。 アイデアは、このカスタムメソッドは、現在のルートを検出し、{ページ}パラメータの正しいセグメントの位置を使用するようにリンクを調整することができるということである。
それはページネータのリンクを溶液用 – Adam