Search code examples
phplaravellaravel-8

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


I am trying create a paging on my page using the

request()->fullUrlWithQuery(["page" =>$page_number])

However, instead of getting the full url with query params with the page param appended to it. I get only the path with the page param appended

@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

The original url

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

and when I output:

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

I get

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

and

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

respectively.


Solution

  • The issue is that your query parameters are null.

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

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

    Unfortunately for your use case, http_build_query() will drop parameters which are null:

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

    If you want your query parameters which are null to show up in the path you're generating, you'll need to write some custom code in your controller to handle that.

    I suggest using the code linked here to parse the URL generated by fullUrl(), adding the page number to the resulting array, setting all null values in the array to the empty string "", then passing the resulting array to http_build_query().

    Personally, I think a better pattern is for your controller to be able to handle queries that are missing the parameters you expect.

    P.S. The reason fullUrl() doesn't drop the parameters which are null is because it isn't merging arrays, so it doesn't call Arr::query() - code for reference