Caching no Yii - usando o cache dinâmico

otavio publicou em 04/10, 21:28 hs , e editou pela última vez há mais de 4 anos atrás.

Um dos melhores recursos de caching do Yii é o page caching, por seu padrão não obstrusivo do código. Mas esse recurso sozinho, em ambientes logados, é difícil de ser implementado. É comum (quase padrão) que aplicações tenham diferentes tipos de usuários (user roles).

Com isso, informações como o menu, a sidebar de usuário logado e informações específicas do mesmo caducariam com o uso simples do page caching. Ou passariamos a ter uma página de cache por cada tipo de usuário, e, às vezes, usuário por usuário.

Isso acaba gerando muita persistência e um reuso menor do cache.

Para solucionar esse tipo de problema, o Yii implementa o dynamic caching. Esse recurso

Um exemplo abaixo é o uso do renderdynamic de menu:

Em layout_fidelize alteramos a chamada direta ao widget para:

<?php $this->renderDynamic('dynamicMenu'); ?>

E no Controller.php (controller básico do qual todos os outros controllers herdam) foi criada a função:

public function dynamicMenu()
{
 $listaMenu = MenuFidelize::buscarPorNivel(Yii::app()->user->getId_Nivel());
 if (count($listaMenu) > 0) {
  return $this->widget('fidelize.menu.FMenu', array('items' => $listaMenu,), true );
 }
 return "";
}

No arquivo que fica cacheado, a informação de Dynamic caching é substituída por um parâmetro:

<###dynamic-1###>

E esse parâmetro é substituído por um conteúdo de forma dinâmica (no caso, um menu diretamente associado ao tipo, role, de usuário).

É importante que a função public no controller sempre retorne uma string. Mesmo que vazio. Senão o dynamic não é substituído e fica na página.

Links:

  • Widget
    • http://www.yiiframework.com/doc/api/1.1/CBaseController#widget-detail
  • renderDynamic
    • http://www.yiiframework.com/doc/api/1.1/CController#renderDynamic-detail
    • http://stackoverflow.com/questions/10030594/dynamic-render-in-yii
if(typeof jQuery == 'undefined'){ document.write("