Php Laravel分页URL

Php Laravel分页URL,php,laravel,laravel-4,Php,Laravel,Laravel 4,有没有办法在Laravel4中获得一个分页的漂亮URL 例如,默认情况下: http://example.com/something/?page=3 我想得到的是: http://example.com/something/page/3 此外,分页应该以这种方式呈现,并且分页的附加应该以这种方式显示。我唯一能想到的方法是扩展Paginator类来进行匹配。但是,要知道它可能与第三方包和其他类/库冲突。当前方法设计用于几乎所有类/库/包 或许您可以尝试以下方法: (‘desmart’的‘分页’

有没有办法在Laravel4中获得一个分页的漂亮URL

例如,默认情况下:

http://example.com/something/?page=3
我想得到的是:

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

此外,分页应该以这种方式呈现,并且分页的附加应该以这种方式显示。

我唯一能想到的方法是扩展Paginator类来进行匹配。但是,要知道它可能与第三方包和其他类/库冲突。当前方法设计用于几乎所有类/库/包

或许您可以尝试以下方法:


(‘desmart’的‘分页’)

这里有一个简单的解决方法。我使用的是Laravel v4.1.23。它假定页码是url的最后一位。我还没有对它进行深入测试,所以我对人们能找到的任何bug都感兴趣。我对更好的解决方案更感兴趣:-)

路线:

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
class Articles extends Eloquent {
    protected $table = 'articles';
}

这是可能的,但您需要编写一点代码

首先,您需要在
app/config/app.php
pagination服务提供者中进行更改-您需要编写自己的

评论:

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

}
<?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();
    }        
} 
<?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);
    }
}
这里只创建
\Utils\Paginator
对象,现在让我们创建它:

model/Utils/Paginator.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');
    }

}
<?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();
    }        
} 
<?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);
    }
}
正如您所见,我们在这里使用
作为
定义了路由名称(这一点很重要,因为上面的Paginator实现-但您当然可以用不同的方式来实现)

现在在
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(); ?>
没有?在查询字符串中


但是在我看来,默认情况下应该添加类似的内容,或者至少扩展一个类就足够了,而不是仅仅为了实现一个方法而创建3个类。

希望这对其他人有所帮助,我已经在模型中使用了一个特性。 其思想是,此自定义方法可以检测当前路由并调整链接,以便为{page}参数使用正确的段位置:


适用于使用laravel 5.6版的任何人+

您可以传递其他参数来设置页码

根据:

例如:

StoreController.php

/**
 * Show sale item based on given page
 *
 * @param int $page
 * @return \Illuminate\Http\Response
 */
public function showPage($page = 1)
{
    $saleItems = SaleItem::paginate(10, array('*'), 'page', $page);

    ...
}

然后,在您的刀片模板中。您只需
路由(…,数组('page'=>$page))

对于Laravel 5.8,请在blade.php中使用此解决方案,在其中生成链接:

    $links = $data->links(); 
    $patterns = '#\?page=#';

    $replacements = '/page/';
    $one = preg_replace($patterns, $replacements, $links);

    $pattern2 = '#page/([1-9]+[0-9]*)/page/([1-9]+[0-9]*)#';
    $replacements2 = 'page/$2';
    $paginate_links = preg_replace($pattern2, $replacements2, $one);
    echo $paginate_links;


感谢您提供的解决方案,我同意您的看法,在Laravel中覆盖某些默认功能非常困难,它总是需要创建新的自己的服务提供商,它必须是某种覆盖生成器。请解释您的答案,因为这不清楚如何使用您的方法构建/some url/page/2而不是/some url?page=2。对于Laravel 5.8,请参阅我使用的是Laravel 8,这应该标记为正确answer@VeRJiL谢谢
    $links = $data->links(); 
    $patterns = '#\?page=#';

    $replacements = '/page/';
    $one = preg_replace($patterns, $replacements, $links);

    $pattern2 = '#page/([1-9]+[0-9]*)/page/([1-9]+[0-9]*)#';
    $replacements2 = 'page/$2';
    $paginate_links = preg_replace($pattern2, $replacements2, $one);
    echo $paginate_links;