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