Я использую Cache::read()
, Cache::write()
в CakePhp для кэширования запросов.
Как обновить paginator params или CacheE paginator?
Легко кэшировать результат запроса, но как кэшировать $this->Paginator->params()
тоже?
Я пытался использовать Cache::write()
$this->Paginator->params()
но как изменить $this->Paginator->params()
после кеширования? Когда я делаю что-то вроде: …
$this->Paginator->params['paging'][$model] = $paginator_params;
… Я заметил:
Indirect modification of overloaded element of CakeRequest has no effect
Где и когда я могу переписать параметры PAGINATOR / задать кешированные параметры?
Благодарю.
Вам нужно кэшировать массив $this->request->params['paging']
.
И вам нужно добавить Paginator Helper в массив $helpers
helpers. Если вы этого не сделаете, метод Render для помощника Paginator не будет вызван, а ссылки подкачки будут сломаны.
$page = !isset($this->request->named['page']) ? '1' : $this->request->named['page']; $products = Cache::read('my_unique_cache_id_' . $page, 'query'); $paging = Cache::read('my_unique_cache_id_paging_' . $page, 'query'); if ($products && $paging) { $this->set('products', $products); $this->request->params['paging'] = $paging; }else{ $products = $this->paginate('Product'); Cache::write('my_unique_cache_id_paging_' . $page, $this->request->params['paging'], 'query'); Cache::write('my_unique_cache_id_' . $page, $products, 'query'); $this->set('products', $products); }
Если кто-то придет сюда искать версию CakePHP 2.5+, следующее должно работать хорошо, используя Cache :: запомнить:
list($products, $this->request->params['paging']) = Cache::remember('somestring', function() { return [$this->paginate('Articles'), $this->request->params['paging']]; });
У вас будет массив, $ products, который вы можете установить на свое представление для рендеринга.