2010-07-17 3 views
0

Я новичок в Symfony, и у меня возникла проблема с организацией логического кода.Разная версия кеша в Symfony

Проблема связана с кешем и другой версией веб-страницы для гостей, зарегистрированных пользователей и владельцев.

Например. У меня есть «пользовательский» модуль, который имеет действие «показать», а URL-адрес/user/show /: id и URL-адрес для каждого посетителя одинаковы. Но содержание страницы зависит от посетителя и выбрано с условием «если», поэтому ... Если я очищу кеш, а первым посетителем будет гость, тогда другие (включая владельца и зарегистрированные пользователи) будут видеть кэшированную страницу гостя.

Какое-то решение может быть разделено на каждый вид (владелец, гость, зарегистрированный пользователь) до частичного, но это против правила DRY.

Как это сделать?

ответ

2

Вы можете использовать параметр sf_cache_key. See here how. Я думаю, вы могли бы использовать user_id для зарегистрированного пользователя, добавленного с произвольной строкой для владельца, а для гостей - строка «гость».

Немного псевдо-кода, чтобы помочь вам в дальнейшем:

$sf_cache_key = ''; 
if ($visitor->isLogged()) 
{ 
    if ($visitor->getId() == $userId) 
    { 
     $sf_cache_key = 'owner' . $userId; 
    } 
    else 
    { 
     $sf_cache_key = 'logged_in' . $userId; 
    } 
} 
else 
{ 
    $sf_cache_key = 'guest' . $userId; 
} 
+0

Я уже внимательно прочитал документацию. Изучение примера :) Существует страница профиля (пользователь/шоу/1), с меню и т. Д., И если I (id = 2) откроет эту страницу (пользователь/показать/1), она будет кэшироваться. В качестве гостя на его странице я вижу такие кнопки, как «добавить друзьям» или «отправить сообщение». Когда пользователь с id = 1 открывает свою домашнюю страницу, он увидит кешированную страницу с кнопками:/ Простым решением будет различный кеш для владельца, гостей друзей, но это возможно? Конечно, я использую указанную sf_cache_key, но я не знаю, как ее использовать в этом случае. Я думал, что это полезно только для удаления частей кеша. – Marcin

+0

Я редактировал свое сообщение, чтобы показать вам, как использовать sf_cache_key в этом случае. Вам просто нужно указать столько разных кеш-кеков, сколько требуемых кэш-версий. – greg0ire

+0

Я не заметил, что вы отредактировали сообщение. решение было настолько простым .. Большое спасибо greg0ire :) – Marcin

0

Я уверен, что вы решили эту проблему сейчас, и приложение уже обновлен до последней версии. Но я решил подобную проблему в общем случае, включив фильтр, который устанавливает пользовательский параметр в каждом URL-адресе, предотвращающем утечку данных. Это разрушает отчетность в GA, что является моей текущей проблемой.

// Фильтр класса в приложениях/интерфейс/Библиотека/accessFilter.class.php

<?php 
class accessFilter extends sfFilter 
{ 
    public function execute($filterChain) 
    { 
     $context = $this->getContext(); 
     $context->getRouting()->setDefaultParameter('sw_user_id', $user_id);  
     $filterChain->execute(); 
    } 
} 

// Определение фильтра в приложениях/интерфейс/конфигурации/filters.yml

# insert your own filters here 
accessFilter: 
    class: accessFilter 

// Использование в маршрутах в приложениях/frontend/config/routing.yml

dashboard: 
    url: /dashboard/:sw_user_id/home 
    param: { module: dashboard, action: index } 
Смежные вопросы