Предупреждение. Механизм кэширования Symfony не поддерживает частное кэширование.Неправильное применение приведет к утечке данных!
Не использовать cache.yml
Не использовать cache.yml
для содержимого, которое зависит отсеанс любым способом, особенно контент, который ограничен сеансом.cache.yml безусловно отображает первую версию, которую пользователь видел для всех остальных , вошли или нет.
Использовать условный фильтр кэша
Вместо этого создайте условный кеш-фильтр .Следующее будет кэшировать каждую страницу, и, следовательно, отображать версию первого пользователя , для всех пользователей, имеющих учетные данные myCredential
.
// apps/myApp/lib/conditionalCacheFilter.php
class conditionalCacheFilter extends sfFilter() {
public function execute($filterChain) {
$context = $this->getContext();
$user = $context->getUser();
if ($user->isAuthenticated() && $user->hasCredential('myCredential')) {
foreach ($this->getParameter('pages') as $page) {
$context->getViewCacheManager()->addCache($page['module'], $page['action'], array('lifeTime' => 300));
}
}
// Execute next filter
$filterChain->execute();
}
}
# filters.yml
conditionalCache:
class: conditionalCacheFilter
param:
pages:
- { module: myModule, action: myAction }
cache: ~
Вариант использования
Это полезно для тяжелой страницы данных, отображаемой только пользователям с определенными учетными данными, но все пользователи получают одну и ту же страницу.Хорошим примером является коллекция страниц статистики, относящихся к учетным данным.
Альтернативное использование
Вы также можете напрямую указать страницы, которые будут добавлены в кэш для фильтра.Может быть полезным отказоустойчиво по-прежнему явно активировать фильтр только для определенных страниц.
// apps/backend/lib/conditionalCacheFilter.php
$context = $this->getContext();
$user = $context->getUser();
if ($user->isAuthenticated() && $user->hasPermission()) {
$context->getViewCacheManager()->addCache('myModule', 'myAction', array(
'withLayout' => true,
'lifeTime' => 3600,
));
}
#filters.yml
conditionalCache:
class: conditionalCacheFilter
pages:
- { module: myModule, action: myAction }
Нет истинного частного кэширования
Symfony не имеет положений для-пользовательский кеш.Вы должны использовать заголовки управления кэшем на стороне клиента с частной настройкой для этого случая использования.Вы также можете использовать обратный прокси-сервер nginx или аналогичные настройки.