Кэширование Cakephp View на основе пользовательского ключа

В моем проекте мы отображаем пользовательские виджеты на страницах наших клиентов. Сами виджеты меняются не очень часто, поэтому я считаю, что кэширование представлений может быть здесь чрезвычайно полезным.

Но каждый виджет отличается в зависимости от того, какая компания в нашей системе его запрашивает.

Мой вопрос заключается в использовании помощника кэширования... или любого другого метода, могу ли я кэшировать виджет на основе идентификатора компании?

<?php
App::uses('AppController', 'Controller');

class widgetController extends AppController {


    public $helpers = array( 'Cache' );

    public $cacheAction = array(
        'iframeForm' => 3600,
    );

    public $uses = array('Company');

    public function index( $company_id ) {

        //... Load up a ton of data

        $this->layout = 'widget';

        $this->set( compact(/* Set a ton of data */) );

    }
}

Можно ли кэшировать представление индекса на основе идентификатора компании, чтобы:

/widget/index/1

подается одна копия из кеша, но:

/widget/index/2

получит другую копию из кеша?

В настоящее время мы работаем на Cake 2.3 и php5.3, у нас есть планы перейти на Cake2.4 и php 5.5, если это поможет нам.


person Neil Holcomb    schedule 10.01.2014    source источник


Ответы (1)


Я бы сделал что-то вроде этого:

Контроллер:

public function index( $company_id ) {

    //... Load up a ton of data
    $this->Model->getStuff($company_id);

    $this->layout = 'widget';

    $this->set( compact(/* Set a ton of data */) );

}

В модели:

public function getStuff( $company_id ) {
    if(($modelData = Cache::read('modelDataCompanyID_'. $company_id)) == null)
    {
      $modelData = $this->find('all',array('conditions' => 
          array('Model.company_id' => $company_id)));
      Cache::write('modelDataCompanyID_'. $company_id, $modelData);
    }
    return $modeData;
   }
}

Это то, что вы хотите?

person Harris    schedule 13.01.2014
comment
Я не хочу кэшировать модальный слой... Я хочу кэшировать слой просмотра. Представление будет разным для каждой компании, которая обращается к нему, поэтому Cache Helper, похоже, не будет работать. Вот почему я надеялся найти способ получить вывод представления и кэшировать его с ключом, являющимся идентификатором компании... тогда в следующий раз я мог бы найти этот кеш и сервер, прежде чем я даже вызову слой модели . - person Neil Holcomb; 14.01.2014