2015-03-19 4 views
2

У меня есть веб-сайт, на котором первая страница содержит форму поиска с несколькими полями.Laravel store session in cookie

Когда пользователь выполняет поиск, я делаю вызов ajax функции в контроллере.

В основном, когда пользователь нажимает на кнопку отправки, я посылаю вызов AJAX через почту на:

Route::post('/search', '[email protected]'); 

Тогда в SearchController классе, в функции general, хранить значения, полученные в переменная сеанса, который является объектом:

Session::get("search")->language = Input::get("language"); 
Session::get("search")->category = Input::get("category"); 
//I'm using examples, not the real variables names 

после обновления переменной сеанса, на самом деле, сразу после того, было показано выше фрагмент кода, создать (или переопределить) печенье хранения значений сеанса:

Cookie::queue("mysite_search", json_encode(Session::get("search"))); 

И после этой операции я выполнить поисковый запрос и отправить результаты и т.д.

Все, что отлично работает, но я не получаю обратно значения в куки. Позвольте мне объяснить.

Как только на первой странице моего сайта открыт, я выполнить действие, как это:

if (!Session::has("search")) { 

     //check for a cookie 
     $search = Cookie::get('mysite_search'); 

     if($search) Session::put("search", json_decode($search)); 
     else { 
      $search = new stdClass(); 
      $search->language = "any"; 
      $search->category = "any"; 
      Session::put("search", $search); 
     } 

} 

Это, кажется, всегда неудачу if($search) всегда возвращается false, и в результате, моя переменная сеанса search всегда имеет свои свойства language и category, заселенное значением any. (Опять же: я использую примеры, а не имена реальных переменных).

Итак, я хотел бы знать, что здесь происходит и как я могу достичь того, что я собираюсь сделать.

Я пытался поставить Session::put("search", json_decode($search)); сразу после $search = Cookie::get('mysite_search'); извлекая все if else блок, и выдает ошибку (Ajax вызов возвращает ошибку), так что вся вещь failling в какой-то момент, при сохранении объекта в куки или когда сбрасывая его.

Или может быть что-то еще. Я не знаю. Вот почему я здесь. Спасибо, что прочитал такой длинный вопрос.

+1

Вы используете функцию getter session, это для получения данных сеанса, а не для установки. В Laravel 4 используется синтаксис 'Session :: put ('key', 'value');' синтаксис для установки переменных сеанса. – Joe

+0

@ Joe Я не понимаю, что вы говорите. Я помещаю сессию: '' Session :: put («поиск», json_decode ($ search)); '. Позже я переопределяю некоторые свойства сеанса, такие как: '' Session :: get ("search") -> language = Input :: get ("language"); '', который отлично работает (переменная сеанса получает эту специфическую имущество переоценивается). Проблема заключается в json_encode и json_decode. Все остальное отлично работает. – user2755140

+0

Цитата: «Я попытался поставить Session :: put (« поиск », json_decode ($ search)), сразу после $ search = Cookie :: get ('mysite_search'), удалив весь блок if else, и который выдает error (вызов ajax возвращает ошибку), поэтому все это происходит в какой-то момент, при хранении объекта в файле cookie или при его восстановлении ». – user2755140

ответ

3

Хорошо. Это то, что происходило.

Проблема заключалась в следующем:

Cookie::queue("mysite_search", json_encode(Session::get("search"))); 

Перед тем, что путь я имел это:

Cookie::forever("mysite_search", json_encode(Session::get("search"))); 

Но по какой-то причине, что подход с forever не создавал никакого печенья, поэтому я (Laravel 4.2). Но queue нуждается в третьем параметре с истечением срока действия. Итак, что действительно происходит, это то, что cookie удаляется после закрытия браузера (у меня также есть session.php в папке app/config, установленной в 'lifetime' => 0 и 'expire_on_close' => true, что именно то, что я хочу).

Проще говоря, установить время истечения навсегда (5 лет) так:

Cookie::queue("mysite_search", json_encode(Session::get("search")), 2592000); 

И теперь, кажется, работает нормально, после тестирования его.