У меня проблемы с сеансами laravel 4.1 и неожиданное поведение.
В зависимости от того, как я вызываю метод контроллеров, сеанс работает или не выполняет мое приложение на POST-маршруте – для добавления элементов в корзину, которая является сеансом. По какой-то причине сеанс не обновляется. Однако, если я вызываю одну и ту же функцию с запросом GET, функция работает так, как ожидалось.
Мои routes.php
содержат эти два маршрута:
Route::get('testAdd', array('uses' => 'ProductsController@addToCart')); Route::post('products/addToCart', array('uses' => 'ProductsController@addToCart'));
Оба указывают на тот же метод
В настоящее время этот метод (для тестирования):
public function addToCart() { Session::put("addcarttest", "add to cart"); return json_encode(Session::get('addcarttest')); }
Если я вызову функцию методом POST (с данными формы), я получу ожидаемый результат и содержимое сеанса.
Однако, если я затем проверяю сеанс (используя профилировщик), он не существует. Данные не сохранялись.
Если я затем вызову тот же метод с использованием маршрута GET, я получу ожидаемый результат, но важно, чтобы сессия продолжалась.
Я подумал, что, возможно, метод POST удалял сеансы, однако, когда он существует, он остается там – если я использую метод GET и существует sessin, если я затем снова попытаюсь использовать пример метода POST, сеанс остается на месте – поэтому метод POST не удаляет сеанс.
Это сводит меня с ума – я потерял много часов и не понимаю, почему.
Я что-то упустил из-за того, как Laravel обрабатывает POST v GET? Почему два разных метода имеют значение для базовых функций?
Что мне нужно сделать, чтобы сеанс работал правильно с помощью POST?
Обновить:
Теперь я попробовал драйвер базы данных для сеанса и получаю такое же поведение.
Я уже прошел мой этап: я создал базовую форму и представил URL-адрес, и метод работал так, как ожидалось. Мои текущие данные формы передаются jquery ajax и предполагают, что они были довольно идентичными по своему характеру.
Моя функция отправки jquery такова:
$.ajax({ url: '/products/addToCart', type: 'POST', async: false, }) .done(function() { console.log("success"); }) .fail(function() { console.log("error"); }) .always(function() { console.log("complete"); }); return false;
Я установил async в false – я предполагаю, что жду ответа сервера. (не работает, если это правда).
Таким образом, проблема заключается в тонкой разнице между формой submit и ajax submit. Оба метода используют один и тот же маршрут и метод – один сохраняет данные сеанса, а другой – нет.
Как я могу победить? Jquery submit имеет важное значение для этой части приложения.
Успех!
Я нашел аналогичную проблему, связанную с laravel 3. Для того, чтобы сессия сохранялась в вызове ajax, мне нужно правильно вернуть ответ.
return json_encode($response);
Это вызывает проблему. Это не похоже на действительный ответ, чтобы сеанс сохранялся. Я изменил его на:
return Response::json($response);
Это позволило сохранить сессию!
По какой-то причине нормальная форма отправки или вызова метода допускает первый, но ajax этого не делает.
Я видел ссылки в другом месте об эхо-утверждениях в методе, влияющих на данные сеанса, но не думал, что у меня есть – возвращение, я полагаю, должно вести себя подобно эхо-сигналу
Счастливый теперь (до следующей проблемы)
Это сообщение, которое вызвало решение: http://forumsarchive.laravel.io/viewtopic.php?id=1304
У меня такие же проблемы, но при возврате ответа XML, а не JSON.
Я исправил его с помощью сохранения сеанса.
\Session::put('LOGADO.ID_LOJA', $id_loja.time()); \Session::save();
Это фиксировало все внутри вызовов AJAX.
Это касается решения, которое дал Рэй. У меня была очень похожая проблема, решение которой разрешилось. Первоначально у меня было следующее на моем контроллере:
echo json_encode(array('auth' => $auth));
Я изменил это на:
return Response::json(array('auth' => $auth));
Однако это было лишь частью решения. В моем файле javascript я изначально имел:
data = $.parseJSON(data);
Который, если бы я сохранил эхо в контроллере … был бы необходим. очевидно, что Laravel будет делать магию за кулисами при использовании Response :: json (), так что возвращаемые данные уже разбираются. Удаление этой строки в моем файле javascript снова вызвало все радость 🙂