如何从laravel分页的第一页删除查询字符串页面?

时间:2017-03-14 01:01:06

标签: php laravel laravel-5 pagination laravel-5.4

我使用分页,如下所示:

public function index()
    {
        $jobs = Job::paginate(5);
        return view('job.index', compact('jobs'));
    }

在视图中:

{{ $jobs->links() }}

生成两个典型页面存在问题:/job/job?page=1两个页面具有相同的内容。

我想做任何从分页的第一页删除查询字符串page的事情。

我尝试了以下内容:

if ($jobs->onFirstPage()){
  $jobs->setPageName('');
} 

但是这会破坏分页,即页面链接无法正确加载,并且查询字符串值仍然适用于所有页面。

11 个答案:

答案 0 :(得分:3)

我发现此问题的有效解决方案是编辑分页模板

首先使用项目根目录中的以下命令从供应商发布分页模板:

php artisan vendor:publish --tag=laravel-pagination

现在应该找到resources/views/vendor/pagination/default.blade.php处的文件,并且可以使用str_replace()对每个页面的网址和后退导航按钮进行如下编辑:

<li><a href="{{str_replace('?page=1','',$paginator->previousPageUrl())}}" title="{{__('Previous')}}" rel="prev">{{$foxPrev}}</a></li>

 <li><a href="{{str_replace('?page=1','',$url)}}">{{ $page }}</a></li>

更新

?page=10发现了一个错误,因此我们不应该使用str_replace,而应使用preg_replace,如下所示:

<li><a href="{{preg_replace('/\?page=[1]$/','',$url)}}">{{ $page }}</a></li>

更新2:

如果对page以外的页码参数使用任何自定义名称,我们可以使用$pageName属性的paginator getter,如下面的分页模板中所示:

<li><a href="{{preg_replace('/\?'.$paginator->getPageName().'=[1]$/','',$url)}}">{{ $page }}</a></li>

要详细了解如何在同一页面上使用多个分页或如何从视图中自定义页码参数$pageName,请结帐this answer

答案 1 :(得分:1)

您可以扩展 LengthAwarePaginator 方法 url($ page)

/**
 * Get the URL for a given page number.
 *
 * @param  int  $page
 * @return string
 */
public function url($page)
{
    if ($page <= 0) {
        $page = 1;
    }

    // If we have any extra query string key / value pairs that need to be added
    // onto the URL, we will put them in query string form and then attach it
    // to the URL. This allows for extra information like sortings storage.
    $parameters = ($page > 1) ? [$this->pageName => $page] : [];

    if (count($this->query) > 0) {
        $parameters = array_merge($this->query, $parameters);
    }

    return rtrim($this->path
        .(Str::contains($this->path, '?') ? '&' : '?')
        .http_build_query($parameters, '', '&')
        .$this->buildFragment(), '?');
}

答案 2 :(得分:0)

如果您关心SEO,请添加规范标签

我不知道......

if($pageNum==1){
    return redirect()->to($path);
}

$ pageNum id获取请求或自己的类

$ path =&#34; / jobs&#34;

答案 3 :(得分:0)

在您的路线中,为通往您职能部门的路线命名:

Route::get('/yourRoute','YourController@foo')->name('yourRouteName');

然后,在控制器的函数中,使用:

public function foo() {
    if( request()->page=='1' )
    {
            return redirect()->route('yourRouteName',[$id]);
    }
     else {
            // Your function content
    }
}

答案 4 :(得分:0)

我想你可以试试这个:

{{ $jobs->links() }}

{{ $jobs->nextPageUrl() }}

希望这对你有用!

答案 5 :(得分:0)

您可以像这样修改视图:

@if ($page==1)
   <a href="{{ str_replace('?page=1', '', $url) }}">{{ $page }}</a>
@else
   <a href="{{ $url }}">{{ $page }}</a>
@endif

答案 6 :(得分:0)

我发现以下作品并且考虑了page=10问题:

export your pagination views之后,进行以下2处修改:

修改1

替换此:

{{ $paginator->previousPageUrl() }}

与此:

{{ preg_replace('/(?:(&|\\?)page=[1])(?!\\d)/ui','', $paginator->previousPageUrl()) }}

修改2

替换此:

{{ $url }}

与此:

{{ preg_replace('/(?:(&|\\?)page=[1])(?!\\d)/ui','', $url ) }}

答案 7 :(得分:0)

我已经这样做了:

{{ $posts->currentPage() == 2 ? route('home') : $posts->previousPageUrl() }}

答案 8 :(得分:0)

提高了阿克西语答案

app / Services / CustomLengthAwarePaginator.php

<?php

namespace App\Services;

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;

class CustomLengthAwarePaginator extends LengthAwarePaginator
{
    /**
     * Get the URL for a given page number.
     *
     * @param  int  $page
     * @return string
     */
    public function url($page)
    {
        if ($page <= 0) {
            $page = 1;
        }

        // If we have any extra query string key / value pairs that need to be added
        // onto the URL, we will put them in query string form and then attach it
        // to the URL. This allows for extra information like sortings storage.
        $parameters = ($page > 1) ? [$this->pageName => $page] : [];

        if (count($this->query) > 0) {
            $parameters = array_merge($this->query, $parameters);
        }

        return $this->path()
            . (count($parameters) > 0
                ? (Str::contains($this->path(), '?') ? '&' : '?')
                : '')
            . Arr::query($parameters)
            . $this->buildFragment();
    }
}

在AppServiceProvider.php或其他

public function boot()
{
    app()->bind(LengthAwarePaginator::class, CustomLengthAwarePaginator::class);
}

答案 9 :(得分:0)

使用这个命令创建一个中间件

php artisan make:middleware RemovePageQuery

在中间件中编写这段代码

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class RemovePageQuery
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->page == 1)
        {
            return redirect(url()->current());
        }
        
        return $next($request);
    }
}

在 $middleware 内的 App/Http/Kernel.php 中添加全局中间件。

 protected $middleware = [
        // \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\RemovePageQuery::class, //Here
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

答案 10 :(得分:0)

我正在寻找解决类似问题以防止内容重复,但对于 symfony 而不是 laravel。我以我的方式修复了它并决定发布它。也许它会帮助某人。

在 symfony 中,我使用 KNP 分页器。它提供分页器模板,如下所示:

     <a href="{{ path(route, query|merge({(pageParameterName): page})) }}">{{ page }}</a>

'Query' 数组包含路由参数,任务是删除页面参数,如果它 == 1。

很简单:

    {% set page_seo = (page == 1) ? null : page %}
    <a href="{{ path(route, query|merge({(pageParameterName): page_seo})) }}">{{ page }}</a>

实际上 - 如果它 == 1,则设置为空页。