PHP сессия / JSON / Javascript - PullRequest
       1

PHP сессия / JSON / Javascript

0 голосов
/ 21 ноября 2018

Мне нужно выяснить, почему я не могу передать этот сеанс в JS для объекта JSON.Я уверен, что упустил что-то простое.

У меня установлена ​​переменная Session в laravel

Session::put('test', "{'test1':'123','test2':'456'}");

Я хочу установить это на странице в js:

<script>var testvar = "{{\Session::get('test')}}";

тогда я пытаюсь сделать это в js:

var test_json = JSON.parse(testvar);

но я вижу, что js testvar установлен с закодированными кавычками?

что я делаю неправильно ???

1 Ответ

0 голосов
/ 21 ноября 2018

Проблема

Ваш следующий код

<script>
   var testvar = "{{\Session::get('test')}}";
   var data = JSON.parse(testvar);
</script>

будет интерпретирован как:

<script>
   var testvar = {'test1':'123','test2':'456'};
   var data = JSON.parse(testvar);
</script>

{'test1':'123','test2':'456'} неверный JSON, так как вам нужно использовать двойнойкавычки вместо одинарных кавычек.

Итак, вам нужно:

Session::put('test', '{"test1":"123","test2":"456"}');

Но это создает еще одну проблему.

Laravel автоматически экранирует HTML по соображениям безопасности, чтобы избежать атак XSS.

Этоозначает, что вышеперечисленное теперь интерпретируется как:

<script>
    var testvar = {&quot;test1&quot;:&quot;123&quot;,&quot;test2&quot;:&quot;456&quot;}&quot;
    var data = JSON.parse(testvar);
</script>

Если вы уверены, что данные, которые вы храните, безопасны, вы можете использовать необработанные теги, подобные этим, и избегать использования JSON.parse (поэтому нам не нужночтобы снова экранировать любую из кавычек), например:

<script>
    var testvar = {!! Session::get('test') !!};
</script>

Затем будет выведен HTML:

<script>
    var testvar = {"test1":"123", "test2":"456"};
</script>

Лучшее решение

Лучший способдля хранения ваших данных в виде массива в сеансе PHP:

Session::put('test', [
    'test1' => '123',
    'test2' => '456'
]);

Тогда вы можете просто сделать:

<script>
    var testvar = @json(Session::get('test'));
</script>

Это объясняется здесь: https://laravel.com/docs/5.7/blade#displaying-data

Side Note

В качестве примечания, подумайте о том, чтобы передать переменную в blade-сервер, чтобы избежать использования логики в ваших представлениях следующим образом:

return view('your-view-name', [
    'testvar' => Session::get('test'),
]);

Тогда вы можете просто сделать:

<script>
    var testvar = @json($testvar);
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...