Проблема
Ваш следующий код
<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 = {"test1":"123","test2":"456"}"
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>