2015-11-02 3 views
1

Я пытаюсь использовать запрос ajax для сохранения переменной сеанса, которая используется для отключения фоновых изображений моего сайта. На данный момент это работает, если я просто перехожу на сам маршрут, однако, если я запустил функцию через запрос ajax, она полностью завершится и не сохранит значение для сеанса, даже если оно отобразится в dd(Session::all()) сразу после ,Laravel 5.0 ajax запрос сохранения переменной сеанса

<?php namespace App\Http\Controllers; 

use App\Http\Controllers\Controller; 
use Session; 
use Request; 
use App; 
use Response; 

class SessionVarController extends Controller { 

    public function backgroundImgsOff() 
    { 
     if(Request::ajax()) 
     { 
      Session::put(['backgroundImgDisable' => true]); 
      return Response::json(); 
     } 
     else 
     { 
      App::abort(404, 'Page not found.'); 
     } 
    } 

    public function backgroundImgsOn() 
    { 
     if(Request::ajax()) 
     { 
      Session::forget(['backgroundImgDisable']); 
      return Response::json(); 
     } 
     else 
     { 
      App::abort(404, 'Page not found.'); 
     } 
    } 

} 

Кто-нибудь знает, почему это похоже на отказ от сохранения переменной сеанса? Я где-то читал, что это может иметь отношение к состояниям сеанса, однако я не смог найти столько, сколько намек на решение.

EDIT: вот мой ajax (имейте в виду, что это моя первая попытка ajax).

function enableBackgroundImages() { 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } else { 
     // code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.open("GET","{{ action('[email protected]') }}",true); 
    xmlhttp.send(); 
} 
function disableBackgroundImages() { 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } else { 
     // code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.open("GET","{{ action('[email protected]') }}",true); 
    xmlhttp.send(); 
} 

Вот кнопки на странице:

<div id="background-on-off" style="display:inline-block;"> 
    Background Images: 
    <a href="#" onClick="enableBackgroundImages();"> 
     On 
    </a> 
    /
    <a href="#" onClick="disableBackgroundImages();location.reload();"> 
     Off 
    </a> 
</div> 

Наконец, здесь мои маршруты:

Route::get('background_images_on', '[email protected]'); 
Route::get('background_images_off', '[email protected]'); 

Благодарности.

ответ

6

Ваш код контроллера работает. Вероятно, это связано с тем, как ваши маршруты или ваш аякс-вызов.

routes.php

Route::post('background-imgs/disable','[email protected]'); 
Route::post('background-imgs/enable','[email protected]'); 

JQuery

$("#on").on('click', function() { 
     var that = this; 
     $.ajax({ 
      type: "POST", 
      url:'/background-imgs/enable' 
     }); 
    }); 

    $("#off").on('click', function() { 
     var that = this; 
     $.ajax({ 
      type: "POST", 
      url:'/background-imgs/disable' 
     }); 
    }); 

Вы можете нормализовать это немного, если вы хотите, и возвращать значение, так что вы можете увидеть, что происходит.

routes.php

Route::post('background-imgs/{action}','[email protected]') 
    ->where('action', '[enable]*[disable]*'); 

контроллер

class SessionVarController extends Controller { 

public function backgroundImages($action = 'enable') 
{ 
    if(!Request::ajax()) 
    { 
     abort(404, 'Page not found.'); 
    } 
    if ($action === 'enable'){ 
     Session::forget(['backgroundImgDisable']); 
     return Response::json(['background' => 'enabled']); 
    } 
    Session::put(['backgroundImgDisable' => true]); 
    return Response::json(['background' => 'disabled']); 

} 

Редактировать на обновленный вопрос

Вам нужно добавить заголовок X-Requested-With к вашему XMLHttpRequest.

Laravel использует Symfony, чтобы проверить, является ли он запросом ajax.

public function isXmlHttpRequest() 
{ 
    return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); 
} 

Код javascript должен выглядеть следующим образом.

function enableBackgroundImages() { 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } else { 
     // code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.open("GET","{{ action('[email protected]') }}",true); 
    xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest'); 
    xmlhttp.send(); 
} 
function disableBackgroundImages() { 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } else { 
     // code for IE6, IE5 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.open("GET","{{ action('[email protected]') }}",true); 
    xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest'); 
    xmlhttp.send(); 
} 

Возможно, вы захотите изучить jQuery. Он добавляет немного объема вашего JavaScript, но с ним гораздо легче справиться.

Вы можете написать свои методы следующим образом.

function enableBackgroundImages() { 
     $.get("{{ action('[email protected]') }}"); 
} 
function disableBackgroundImages() { 
     $.get("{{ action('[email protected]') }}"); 
} 
+0

Это действительный пункт. И на самом деле, @Logan Hasbrouck, возвращая прямой ответ JSON на представление, - единственный способ пойти сюда. Причина этого в том, что представление не «знает» о смене «сеанса», которое произошло во время вызова Ajax. Однако изменение будет отражено после загрузки следующей страницы. Передайте состояние изображения в представление, сделайте то, что вам нужно в обратном вызове Ajax, и переменная Session останется на месте для будущих запросов. – lesssugar

+0

@lesssugar Когда пользователь нажимает для отключения фоновых изображений, сразу после отправки и получения запроса ajax я автоматически перезагружаю страницу, чтобы изменения вступили в силу. Я взгляну на свои маршруты. На данный момент я настроил его как запрос на получение. –

+0

Все еще не работает. Я предполагаю, что я перепутал где-то с моим аяксом, так как это мой первый раз, когда я пытаюсь использовать ajax. Я добавил свой код ajax и кнопки, которые вызывают функции ajax. –

0

Самый простой способ в laravel 5.3 использовать

\Session::put("userid",Input::get('userid')); 
    \Session::save(); 
0

Чтобы вернуться из ajax-вызова, вам нужно добавить следующие строки, и он будет работать как магия.

$result['status'] = 'success'; 
return json_encode($result); 
exit; 

У меня была та же проблема. Я использовал оператор echo json_encode($result);, а затем я заменил его возвратом json_encode($result); и он работает как шарм.

Смежные вопросы