Laravel 5分页链接到错误的地方

Posted

技术标签:

【中文标题】Laravel 5分页链接到错误的地方【英文标题】:Laravel 5 Pagination linking to wrong place 【发布时间】:2015-06-05 06:13:07 【问题描述】:

我目前正在将我的一个项目从 4.2 更新到 Laravel 5。我知道分页器类发生了很多变化,但我真的不知道为什么这不起作用。我在项目中的多个位置对 eloquent 模型调用 paginate() 并且一切都很好。

但是同一个项目有一个带有过滤器的配置文件搜索页面,所以我必须调用一个巨大的自定义 DB::table() 查询。之后我想从结果中构建一个分页器对象。

$q = \DB:: HUGE QUERY HERE....

// Execute query
$results = $q->get();

// Get pagination information and slice the results.
$perPage = 20;
$total = count($results);
$start = (Paginator::resolveCurrentPage() - 1) * $perPage;
$sliced = array_slice($results, $start, $perPage);

// Eager load the relation.
$collection = Profile::hydrate($sliced);
$collection->load(['sports', 'info', 'profileImage']);

// Create a paginator instance.
$profiles = new Paginator($collection->all(), $total, $perPage);

return $profiles;

我的问题是调用$profiles->render() 后生成的链接链接到我的项目的根目录而不是当前页面。

示例: 链接位于mysite.com/profiles,但链接到mysite.com/?page=2 而不是mysite.com/profiles?page=2

我的代码在 Laravel 4.2 中运行良好,我将其链接在下面以供参考:

工作的 Laravel 4.2 代码

$q = \DB:: HUGE QUERY HERE....

// Execute query
$results = $q->get();

// Get pagination information and slice the results.
$perPage = 20;
$total = count($results);
$start = (Paginator::getCurrentPage() - 1) * $perPage;
$sliced = array_slice($results, $start, $perPage);

// Eager load the relation.
$collection = Profile::hydrate($sliced);
$collection->load(['sports', 'info', 'profileImage']);

// Create a paginator instance.
$profiles = Paginator::make($collection->all(), $total, $perPage);

return $profiles;

欢迎任何帮助。 谢谢!

【问题讨论】:

mysite.com\?page=2 这里的正斜杠是正确的还是错字? 糟糕,这是一个错字,我的意思是 / 我想知道 str_replace 在这里是否适合您,例如:str_replace('/?', '?', $profiles->render()); 这仍将链接到主页而不是个人资料页面:mysite.com?page=2 而不是 mysite.com/profiles?page=2 尝试调整参数:str_replace('/?', '/profiles?', $profiles->render()); 但是你不应该像这样破解它,其他地方肯定存在潜在问题...... 【参考方案1】:

经过几个小时的工作,我终于解决了这个问题!

我发现您可以将路径传递给分页器。 如您所见,这可以通过在构建分页器对象时传递一个数组作为第 5 个参数来完成。该数组将覆盖您传递给它的任何选项。我们需要覆盖path 选项。我正在使用Paginator::resolveCurrentPath() 获取当前路径。

所以我的代码现在看起来像:

// Create a paginator instance.
$profiles = new Paginator($collection->all(), $total, $perPage, Paginator::resolveCurrentPage(), [
    'path' => Paginator::resolveCurrentPath()
]);

对于感兴趣的人,分页器构造函数看起来像:

__construct($items, $total, $perPage, $currentPage = null, array $options = [])

你需要手动传递这个很奇怪,我认为这是一个错误。

【讨论】:

【参考方案2】:

如果这对你有用,我不会抱怨。我们对 ORM 和模型加载有不同的方法,但我希望这会给您一些见解。

初始网址

localhost/application-name/public/publishers/?page=1

控制器

class PublisherController extends Controller 
    public function index()
    
        $publ = Publisher::paginate(5);
        $publ->setPath(''); //I just use custom Url and set path to ''
        return view('publisher-table', ['publishers'=>$publ]);
    

查看

<div class="row">
!! $publishers->render() !!
</div>

结果网址

localhost/application-name/public/publishers?page=1

我相信不同的服务器配置和方法需要不同的方法。我,就我自己而言,我的开发服务器被仅按文件夹分隔的项目所污染。所以,这个解决方案就足够了。

曾经,我读到您可以通过将 DocumentRoot 设置为 Laravel public 文件夹来解决此问题。但是,没有必要为每个开发环境配置虚拟主机。

【讨论】:

以上是关于Laravel 5分页链接到错误的地方的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 分页链接未显示在视图中

Laravel 5.6:自定义分页资源集合元和链接属性

Laravel 5.3,用图片替换分页链接(<< 和 >>)

手动分页错误 - Laravel 5.0

Laravel 5/ 5.4 分页器在 NGINX 生产环境中不工作

附加到 Laravel 中的分页链接 URL