【问题标题】:How to make a Laravel Eloquent Resource include filter parameters in the links?如何使 Laravel Eloquent 资源在链接中包含过滤器参数?
【发布时间】:2019-02-07 17:47:04
【问题描述】:

我们正在对 Spatie 的查询生成器进行一些试验,我想返回一个资源集合。

很遗憾,当您向请求添加过滤器时,这些过滤器不会作为回复的第一个、最后一个、上一个和下一个链接的一部分发回。

这是我们的代码(只是一个非常简单模式的示例ExchangeRate

class ExchangeRateController extends Controller
{
    public function index(Request $request) {
       return \App\Resources\ExchangeRate::collection(
         QueryBuilder::for(ExchangeRate::class)
            ->allowedFilters(
                Filter::exact('currency'), 
                Filter::scope('valid-on')
            )
            ->paginate());
    }
}

当我们调用 GET /api/exchangerates 时,我们将获得 3 页,每页 15 条记录。当我们调用GET /api/exchangerates?filter[currency]=USD时,我们会得到只有 1 条记录的 1 页。这一切都很好,但是 json 响应中的链接没有得到正确的链接。

没有过滤器,我们会得到以下链接:

"links": {
  "first": "https://example.com/api/exchangerates?page=1",
  "last": "https://example.com/api/exchangerates?page=3",
  "prev": null,
  "next": "https://example.com/api/exchangerates?page=2"
}

使用过滤器,我们会在响应中获得以下链接:

"links": {
  "first": "https://example.com/api/exchangerates?page=1",
  "last": "https://example.com/api/exchangerates?page=1",
  "prev": null,
  "next": null
}

所以,它的分页是正确的,但过滤器不包含在链接中,我认为这是不正确的(客户端应该能够信任这些链接以获取 下一页它当前选择的数据集...)

有没有办法做到这一点?

【问题讨论】:

    标签: json laravel api eloquent resources


    【解决方案1】:

    我认为这不是包裹的责任。 Laravel 分页不会在链接中保留查询字符串。看来这是自 4.2 以来的行为。见this.

    您可以通过以下方式做到这一点:

    class ExchangeRateController extends Controller
    {
        public function index(Request $request) {
            return \App\Resources\ExchangeRate::collection(
                QueryBuilder::for(ExchangeRate::class)
                    ->allowedFilters(
                        Filter::exact('currency'), 
                        Filter::scope('valid-on')
                    )
                    ->paginate()
                    ->appends($request->input('currency', 'valid-on'))
            );
        }
    }
    

    【讨论】:

    • 嗯?这对我来说真的没有意义 - 为什么你说这不是包裹的责任?我正在使用一些参数查询资源,它返回不同页面的链接;如果客户请求这些链接,它只会返回完全不同的信息......
    • 你正在调用 paginate(),它扩展了 Laravel 的 Builder。请参阅this - 我也没有看到包做任何事情来添加默认过滤器。也许应该。这值得商榷。
    • 我认为确实应该。 Laravel 的 builder 是生成分页链接的东西;它应该考虑所有资源参数,不是吗?为什么 Eloquent 会正确应用过滤器,但不考虑它们来生成链接。这对我来说毫无意义:(
    • 由于使用appends() 添加您需要的参数很容易,我认为这种行为会保持这种方式以保持灵活性。尽管添加默认过滤器,但您始终可以向库提交 PR。这也有道理:)
    • 了解 Laravel,它可能不会成功,但我只是想让它易于管理......我不想再次在每个控制器方法中重复该逻辑;- ) 感谢您的回复!
    猜你喜欢
    • 2017-03-05
    • 2019-01-25
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多