Json 如何使Laravel雄辩的资源在链接中包含过滤参数?
我们正在通过Spatial对查询生成器进行一些实验,我想返回一个资源集合 不幸的是,当您向请求添加过滤器时,这些过滤器不会作为回复的第一、最后、上一和下一个链接的一部分发送回来 这是我们的代码(只是一个非常简单的模式Json 如何使Laravel雄辩的资源在链接中包含过滤参数?,json,laravel,api,eloquent,resources,Json,Laravel,Api,Eloquent,Resources,我们正在通过Spatial对查询生成器进行一些实验,我想返回一个资源集合 不幸的是,当您向请求添加过滤器时,这些过滤器不会作为回复的第一、最后、上一和下一个链接的一部分发送回来 这是我们的代码(只是一个非常简单的模式ExchangeRate的示例): class ExchangeRateController extends Controller { public function index(Request $request) { return \App\Resources
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
时,我们会得到一页,只有一条记录。这一切都很好,但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
}
因此,它正确地完成了分页,但是链接中没有包含过滤器,我认为这是不正确的(客户端应该能够信任这些链接来获取其当前选定数据集的下一页…)
无论如何,我们可以这样做吗?我认为这不是软件包的责任。Laravel分页不会在链接中保留查询字符串。这似乎是自4.2以来的行为。请参阅 不过,您可以通过以下方法来实现:
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'))
);
}
}
我认为这不是软件包的责任。Laravel分页不会在链接中保留查询字符串。这似乎是自4.2以来的行为。请参阅 不过,您可以通过以下方法来实现:
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的生成器./CODE。我也没有看到包做任何事情来添加默认过滤器。也许它应该是有争议的。我认为它应该是真的。Laravel的生成器是生成分页链接的;它应该考虑所有的资源参数,不是吗?为什么雄辩者正确地应用过滤器,但不考虑。这对我来说毫无意义:(因为使用appends()
添加所需的参数很容易,我认为这样做是为了保持灵活性。您可以始终向库提交PR以添加默认筛选器。这也有意义:)了解Laravel,它可能不会成功,但我只是想让它变得易于管理……我不想在每个控制器方法中重复这种逻辑;-)不过谢谢你的回复!呵呵?这对我来说真的毫无意义-你为什么说这不是包裹的责任?我用一些参数查询一个资源,它返回不同页面的链接;如果客户端请求这些链接,它只会返回完全不同的信息……您正在调用paginate()
,它扩展了Laravel的生成器。请参阅-我也没有看到包在添加默认过滤器方面做任何事情。也许应该。这是有争议的,我认为应该这样做。Laravel的生成器生成分页链接;它应该考虑所有的资源参数,不是吗?为什么EooQueNT正确地应用过滤器,但不考虑它们来生成链接。这对我来说毫无意义:(因为使用appends()
添加所需的参数很容易,我认为这样做是为了保持灵活性。你可以随时向库提交PR来添加默认过滤器。这也有意义:)了解Laravel,可能不会成功,但我只是想让它易于管理。。。我不想在每个控制器方法中重复该逻辑;-)谢谢你的回复!