CakePHP: где установить значения сеанса по умолчанию?

У меня есть приложение, которое использует CakeSession для сохранения различных пользовательских данных. Теперь я хочу записать некоторые значения по умолчанию, используя CakeSession::write(), и сделать их доступными для всех представлений (также для кешированных представлений). Таким образом, проверка/запись должна выполняться при каждом запросе до отображения представления.

Но куда поместить код, соответствующий этим требованиям? До сих пор я пытался использовать CakeSession::write() в следующих позициях, но безуспешно:

  1. Config/bootstrap.php -> CakeSession еще не определен
  2. AppController::__construct() -> CakeSession еще не определен
  3. AppController::beforeFilter() -> не будет вызываться для кешированных представлений

person mixable    schedule 21.12.2012    source источник
comment
вы можете передать 'callbacks'=>true в качестве параметра cacheAction, который запускает beforeFilter.   -  person Ross    schedule 22.12.2012
comment
@Росс Спасибо за эту информацию. Я думаю, что это возможное решение. Можете ли вы сказать что-нибудь о производительности кэшированных файлов при запуске обратных вызовов?   -  person mixable    schedule 22.12.2012
comment
вам придется провести собственный бенчмаркинг, слишком много факторов. И это немного похоже на преждевременную оптимизацию — имейте в виду, но подождите, пока это не станет проблемой, прежде чем слишком беспокоиться.   -  person Ross    schedule 22.12.2012
comment
Я просто спросил, потому что ожидал гораздо большего влияния на производительность. Но все работает как шарм. Спасибо!   -  person mixable    schedule 23.12.2012


Ответы (1)


Кэшированные представления нигде не будут создавать сеансы. Кэшированное представление вообще не инициализирует запрос

документы

It should be noted that once an action is cached, the controller method for the 
action will not be called. When a cache file is created, the request object, 
and view variables are serialized with PHP’s serialize().
person dogmatic69    schedule 21.12.2012
comment
Почему нет? Помощники будут загружены в кэшированном виде. Использование SessionHelper сделает CakeSession доступным в этом представлении. Таким образом, методы CakeSession можно без проблем вызывать в <!--nocache--> тегах. - person mixable; 22.12.2012
comment
Для чтения. Вы не можете писать в сеансы после того, как выходные данные были отправлены, и к тому времени, когда вы находитесь в <!-- nocache -->, выходные данные были отправлены. - person dogmatic69; 22.12.2012
comment
в фрагментах без кеша вы должны только ЧИТАТЬ из сеанса. вы можете писать в файлы cookie через JS/jquery, например, если вам нужно хранить что-то более постоянное. - person mark; 22.12.2012
comment
CakeSession::write() также возможно в пределах <!--nocache-->. Эти теги просто используются в файле кеша (php). Они удаляются во время рендеринга вида и все это происходит до вывода. Из-за этого одним из возможных решений может быть создание элемента внутри <!--nocache--> и размещение всего кода CakeSession::write() в этом элементе. Но является ли элемент правильным местом для записи данных сеанса? Я имею в виду, что это вид... - person mixable; 22.12.2012
comment
вы не должны записывать данные сеанса в представлении или элементе. - person Ross; 22.12.2012
comment
3 Люди говорят, что вы не должны записывать сеансы в представлении, что обычно является хорошим признаком того, что вам не следует записывать сеансы в представлении. - person dogmatic69; 22.12.2012
comment
@dogmatic69 да, вы абсолютно правы. Я также предпочитаю обрабатывать такие данные в контроллере. В моем последнем комментарии я просто хотел указать, что не невозможно записывать данные сеанса в (кешированные) представления. - person mixable; 22.12.2012