Laravel request()->fullUrlWithQuery() 没有按预期工作

Laravel request()->fullUrlWithQuery() doesn't work as expected

我正在尝试使用

在我的页面上创建分页
request()->fullUrlWithQuery(["page" =>$page_number])

但是,不是获取带有查询参数的完整 url,而是附加了 page 参数。我只得到附加了 page 参数的路径

@for($i = 1; $i<=$pagesCount;$i++)
    <li class="page-item {{request()->get("page") == $i ? 'active' :""}}">
        <a class="page-link"
           href="{{request()->fullUrlWithQuery(["page" =>$i])}}">{{$i}}</a>
    </li>
@endfor

原url

http://localhost:8899/offers/find?make=&year=&location=&drive=&color=&min_original_price=&max_original_price=&currency=

当我输出时:

{{request()->fullUrlWithQuery(["page" =>1])}}
</br>
{{request()->fullUrl()}}
</br>

我明白了

http://localhost:8899/offers/find?page=1 

http://localhost:8899/offers/find?color=&currency=&drive=&location=&make=&max_original_price=&min_original_price=&year=

分别

问题是您的查询参数是 null

fullUrlWithQuery() uses Illuminate\Support\Arr::query().

Illuminate\Support\Arr::query() in turn uses the native http_build_query().

不幸的是,对于您的用例,http_build_query() 将丢弃为空的参数:

// returns "test2=data"
http_build_query(["test"=>null,"test2"=>"data"]);

如果您希望 null 的查询参数显示在您生成的路径中,您需要在控制器中编写一些自定义代码来处理该问题。

我建议使用the code linked here解析fullUrl()生成的URL,将页码添加到结果数组中,将数组中的所有null值设置为空字符串 "",然后将结果数组传递给 http_build_query().

就我个人而言,我认为更好的模式是让您的控制器能够处理缺少您期望的参数的查询。

P.S。 fullUrl() 不删除 null 参数的原因是因为它没有合并数组,所以它不会调用 Arr::query() - code for reference

如果这是一个命名路由,它会更简单,但只使用 request() 构建 url,我想你可以使用 tap()[=13] =]

@for ($i = 1; $i <= $pagesCount; $i++)
  <li class="page-item {{ request()->get('page') == $i ? 'active' : '' }}">
    <a class="page-link"
      href="{{ tap(request(), fn($r) => $r->query->add(['page' => $i]))->fullUrlWithQuery([]) }}">
      {{ $i }}
    </a>
  </li>
@endfor