Laravel 5 缓存/分页问题

Posted

技术标签:

【中文标题】Laravel 5 缓存/分页问题【英文标题】:Laravel 5 Cache/Paginate Issue 【发布时间】:2015-07-11 01:12:12 【问题描述】:

所以我决定从 Laravel 4 转到 5,这花了我大约 1-2 天的时间,因为我几乎不知道如何进行转换。在为我的应用程序升级时,我遇到了 Json 分页的一个小问题。

这段代码允许通过 KnockoutJS 对 PageQuery 进行分页

/**
 * Builds paginate query with given parameters.
 * 
 * @param  array   $params
 * @param  integer $page
 * @param  integer $perPage
 * 
 * @return array
 */
public function buildPaginateQuery(array $params, $page = 1, $perPage = 15)

    $query = $this->model;

    $query = $this->appendParams($params, $query);

    $count = (new Cache)->remember('count', '2000', function() use ($query)
        return $query->count();
    );

    $totalPages = $count / $perPage;

    $query = $query->skip($perPage * ($page - 1))->take($perPage);

    $query = $query->order(isset($params['order']) && $params['order'] ? $params['order'] : null);

    //$query = $query->cacheTags(array($this->model->table, 'pagination'))->remember(2000);

    $query = (new Cache)->remember(array($this->model->table, 'pagination'), '2000', function() use ($query)
        return $query;
    );

    return array('query' => $query, 'totalPages' => $totalPages, 'totalItems' => $count);

最终导致此屏幕截图中出现此错误

错误指向上面的代码和这段代码

/**
 * Get the full path for the given cache key.
 *
 * @param  string  $key
 * @return string
 */
protected function path($key)

    $parts = array_slice(str_split($hash = md5($key), 2), 0, 2);
    $path  = $this->directory() . '/'.join('/', $parts).'/'.$hash;

    //unset the tags so we use the base cache folder if no
    //tags are passed with subsequent call to the same instance
    //of this class
    //$this->tags = array();

    return $path;

我正在使用一个名为 TaggedFile 的自定义缓存驱动程序。这在 L4 中运行良好,但遇到了错误,因为在缓存别名中删除了一些文件。就像 StoreInterface。我能得到一些帮助吗?如果您需要我发布任何内容,我会发布任何内容。

更多内容:

在我使用它在 global.php 中注册 taggedFile 驱动程序之前:

Cache::extend('taggedFile', function($app)

    return new Illuminate\Cache\Repository(new Lib\Extensions\TaggedFileCache);
);

我不知道该放在哪里。有谁知道相当于那个?我尝试将它放在 AppServiceProvider 中,但出现错误:

Call to undefined method Illuminate\Support\Facades\Cache::extend()

这曾经在 L4 中工作,所以我决定手动进入供应商文件夹查找问题所在....

这只有:getFacadeAccessor(L4 也只有但可以扩展) 所以我决定使用 getFacadeAccessor 并且它有效,但我不知道这是否是解决方案。

【问题讨论】:

【参考方案1】:

您注意到您将数组作为 $key 值传递,最安全的方法是替换代码

$parts = array_slice(str_split($hash = md5($key), 2), 0, 2);

$parts = array_slice(str_split($hash = md5(json_encode($key)), 2), 0, 2);

注意:我不确定您运行的是什么版本的 php,但 json_encode( ... ) 通常比 serialize( ... ) 更快

【讨论】:

以上是关于Laravel 5 缓存/分页问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 分页自定义

laravel怎么改造分页类,给他加上首页和尾页

Laravel 5.2 分页

laravel的分页系统,怎么获取他的total

Laravel 5 |设置 ID 字段的分页问题

分页不适用于 POST 动作 laravel 5