Как кешировать зависимые от сессии данные в Symfony 1.4? - PullRequest
4 голосов
/ 28 января 2012

После прочтения поведения кэширования Symfony 1.4 .. я узнал, что Symfony 1.4 не рассматривает сеанс пользователя для шаблонов кэширования ..

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

Спасибо, Хардик

Ответы [ 5 ]

3 голосов
/ 06 марта 2014

Предупреждение. Механизм кэширования 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 или аналогичные настройки.

1 голос
/ 08 августа 2012

вы можете кэшировать свой шаблон таким образом

<?php $cache_str='something-that-is-uniq-'.$sf_user->isAuthenticated()?$sf_user->getGuardUser()->getId():'';
<?php if (!cache($cache_str,36000)): ?>
<div> something that you want to cache </div>
  <?php cache_save(); ?>
<?php endif; ?>
1 голос
/ 28 января 2012
0 голосов
/ 30 января 2012

Я повторяю частичное кэширование @ dlondero с параметрами, о которых я до сих пор не знал.

В прошлом проекте я реализовал модифицированный фильтр и менеджер кэширования, которые будут кэшировать на уровне действий на основе сеансаценностиЭто может (?) Быть более эффективным, так как кэширует весь результат действия (т. Е. Не только частичные / компоненты)

https://github.com/yitznewton/freerms/blob/master/apps/resolver/lib/view/freermsResolverCacheManager.class.php

https://github.com/yitznewton/freerms/blob/master/apps/resolver/lib/filter/freermsResolverCacheFilter.class.php

0 голосов
/ 30 января 2012

Hardik, поскольку ваше приложение становится все более и более сложным, лучший способ иметь динамическое и кэшированное содержимое на странице - это использовать частичное и компоненты с их собственными настройками кэша.Вам просто нужно отделить основные разделы, создав частичные и компоненты, чтобы заменить все ваше содержимое.Затем вы добавляете эти меньшие части в nameYourTemplateSuccess.php, которые не должны кэшироваться, в противном случае все части / компоненты будут кэшироваться.

Подробнее о частичках кэширования и компонентах здесь .

...