求解cache无法缓存分页结果

抛出的异常是Error is: "Exception: Serialization of 'Closure' is not allowed"

官方英文站有个同样的帖子
http://forumsarchive.laravel.i ... D6310
但是下边的解决方案还是不好,因为这样没有缓存 分页信息
已邀请:

zhuzhichao

赞同来自: 雨师

主要是因为Paginator对象的实例中有View对象的实例作为Paginator实例的属性,而View对象中包含了闭包,所以不能序列化的。其实Paginator的links方法中是可传view模板的并有默认view模板,所以Paginator涉及到了view对象,以至于不能被缓存的。当然常用的View::make()等方法返回的View对象的也不能cache的。

可以参考我的这篇文章来处理这个问题。这里给出了详细的分析和解决问题的方法。
http://zhuzhichao.com/post/201 ... ator/

安正超

赞同来自:

因为Builder在get或者其它获取结果的操作例如all(),lists()返回的都是结果集或者单个对象,而paginate()返回的是分页对象
\Illuminate\Pagination\Paginator
(参见:Builder::paginate), 而框架底层的Cache,它本身内部都是对基本的数据的缓存,比如数字,或者其它可serialize的对象等,但是如@FiveSay说的,PHP不支持闭包序列化,所以就会报出问题。

网上的不完整解决办法就是把
...->paginate(15)
改成
...->paginate(15)->getItems()
, 就是说缓存结果集部分,但是这样会造成的问题是在模板里就不能用$records->links()这个方法了,因为不是分页对象了。所以可能需要框架更新来支持我们的这个需求。

FiveSay - 成武

赞同来自:

这是由于 PHP 本身是不支持闭包的序列化。
显然你缓存的是一个分页对象而不是你所说的分页结果。
如果你对闭包的序列化感兴趣,不妨看看这个包 PHP Super Closure 它默认已经被引入了。

yuluuc

赞同来自:

个人觉得第二种方法很好

要回复问题请先登录注册