0

0

如何在 Laravel 中安全地将 PHP 变量传递给 JavaScript

碧海醫心

碧海醫心

发布时间:2026-02-12 13:38:32

|

240人浏览过

|

来源于php中文网

原创

如何在 Laravel 中安全地将 PHP 变量传递给 JavaScript

本文详解 laravel 中将 php 变量(包括数组、null 等特殊值)注入 javascript 时的常见语法错误及正确实践,重点讲解为何必须使用 `json_encode()` 处理数组、为何直接双大括号输出 null 会导致 js 语法错误,以及统一推荐的安全方案。

在 Laravel 模板中,开发者常需将后端 PHP 数据(如配置项、API 响应、用户信息等)传递给前端 JavaScript 使用。看似简单的 {{ $var }} 或 {!! $var !!} 插入方式,却极易引发 JavaScript 语法错误——尤其当 $var 是数组、null、布尔值或含特殊字符的字符串时。根本原因在于:PHP 和 JavaScript 是两种独立语言,模板引擎不会自动进行跨语言类型转换;直接回显 PHP 值 ≠ 生成合法的 JS 字面量

❌ 错误写法解析

1. 数组未 JSON 编码 → Array to string conversion 错误

// PHP 后端
$items = ['apple', 'banana', 'cherry'];
<!-- &#38169;&#35823;&#65306;{!! $items !!} &#20250;&#23581;&#35797;&#23558;&#25968;&#32452;&#36716;&#20026;&#23383;&#31526;&#20018;&#65288;&#22914; "Array"&#65289;&#65292;JS &#35299;&#26512;&#22833;&#36133; -->
<script>
  let items = {!! $items !!}; // &rarr; let items = Array; &#10060; &#35821;&#27861;&#38169;&#35823;
</script>

即使 $items 在 PHP 中是数组,Blade 的 {!! !!} 只是原样输出其 __toString() 结果(即 "Array"),而非 JS 数组字面量 [...]。json_encode() 的作用正是将 PHP 数据结构精准序列化为符合 ECMAScript 规范的 JSON 字符串

<script>
  let items = {!! json_encode($items) !!}; // &rarr; let items = ["apple","banana","cherry"]; &#9989;
</script>

2. null 直接输出 → Var = ; 语法错误

// PHP
$userId = null;
<!-- &#38169;&#35823;&#65306;{{ $userId }} &#36755;&#20986;&#31354;&#23383;&#31526;&#20018;&#65292;&#23548;&#33268; JS &#35821;&#21477;&#19981;&#23436;&#25972; -->
<script>
  let id = {{ $userId }}; // &rarr; let id = ; &#10060; SyntaxError: Unexpected token ';'
</script>

同理,{{ $userId }} 对 null 的渲染结果为空,破坏了 JS 语句结构。而试图用条件判断规避:

<!-- &#10060; &#26080;&#25928;&#65306;PHP &#35821;&#27861;&#19982; JS &#28151;&#28102;&#65292;&#19988;&#26465;&#20214;&#26412;&#36523;&#26080;&#27861;&#35299;&#20915;&#36755;&#20986;&#31354;&#30333;&#38382;&#39064; -->
@if($userId)
  let id = {{ $userId }};
@endif

这不仅逻辑冗余,更无法覆盖 0、false、空字符串等“falsy but valid”值,且仍存在类型不一致风险(如 0 被当成整数而非 JS number)。

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用AI匹配职位并完成投递的全自动操作,真正实现'一键职达'的便捷体验。

下载

立即学习PHP免费学习笔记(深入)”;

✅ 推荐解决方案:统一使用 json_encode() + 双引号包裹

最安全、最通用的方式是始终对 PHP 变量调用 json_encode(),并用单/双引号包裹在 JS 字符串上下文中:

<script>
  // &#9989; &#27491;&#30830;&#65306;&#26080;&#35770; $var &#26159; array, null, string, bool, int&#65292;&#22343;&#29983;&#25104;&#21512;&#27861; JS &#20540;
  let config = {!! json_encode($config) !!};           // &#19981;&#21152;&#24341;&#21495;&#65288;&#39030;&#23618;&#21464;&#37327;&#65289;
  let message = "{!! json_encode($message) !!}";      // &#21152;&#24341;&#21495;&#65288;&#30830;&#20445;&#23383;&#31526;&#20018;&#31867;&#22411;&#65289;
</script>

json_encode() 的优势:

  • 自动处理 null → null(JS 合法关键字)
  • 数组/对象 → [] / {}(JS 字面量)
  • 字符串自动转义引号、换行符等(如 "He said \"Hi\"")
  • 布尔值 → true / false(JS 布尔字面量)
  • 数值保持原格式(42, 3.14, -1)
⚠️ 重要注意事项 永远不要使用 {!! $var !!} 直接输出未编码的复杂数据——这是 XSS 高危操作(如 $var = '"; alert(1); "' 会直接执行恶意脚本)。 json_encode() 默认已对 HTML 特殊字符(如 <, &)进行转义,但若需嵌入 HTML 属性,请额外使用 e() 或 htmlspecialchars()。 在 Vue/React 等框架中,建议通过 data-* 属性或 API 接口传递数据,避免模板内大量 JS 注入。

实际示例:完整安全流程

// Controller
return view('dashboard', [
  'user' => auth()->user(),
  'permissions' => ['read', 'write'],
  'lastLogin' => null,
  'isBeta' => false,
]);
<!-- Blade &#27169;&#26495; -->
<script>
  const user = {!! json_encode(auth()->user()) !!}; // Object
  const permissions = {!! json_encode($permissions) !!}; // Array
  const lastLogin = {!! json_encode($lastLogin) !!}; // null
  const isBeta = {!! json_encode($isBeta) !!}; // false
  console.log(user?.name, permissions.length, lastLogin, isBeta); // &#23433;&#20840;&#35775;&#38382;
</script>

总结:将 PHP 变量传入 JavaScript 不是简单的“复制粘贴”,而是跨语言的数据序列化过程。json_encode() 是 Laravel 中桥接二者类型的黄金标准——它保障语法合法性、数据完整性与应用安全性。养成“所有 PHP → JS 传递必经 json_encode()”的习惯,可彻底规避 Array to string conversion、Unexpected token 等典型错误,并构建更健壮的前后端协作基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

329

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

285

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

540

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

378

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

127

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

77

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

69

2025.08.05

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

436

2023.08.07

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

189

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号