dd() 打印后终止执行,适合单点确认;dump() 仅输出不中断,适合流程追踪;blade 中需用 @dd/@dump;调试查询推荐 torawsql() 或先执行再 dd。

dd() 和 dump() 是 Laravel 开发中最直观、最常用的两个调试函数,它们都基于 Symfony VarDumper,输出带颜色、缩进、类型标识的结构化内容,但关键区别在于是否中断执行——这个差异直接决定你能不能看到变量、会不会漏掉后续逻辑、甚至导致页面白屏或报错。
dd():打印完就停,适合单点确认
dd() 是 “dump and die” 的缩写,调用后立即格式化输出变量,并终止整个请求流程。它不关心上下文是否“干净”,只确保当前能走到这一步的数据被清晰呈现。
- 必须放在可执行路径上:比如控制器中要写在 return 之前,中间件里不能写在
return $next($request)后面,路由闭包里可直接使用 - Blade 模板中不能写
{{ dd($user) }},会报错或白屏;正确写法是@dd($user)(Laravel 7+ 支持) - 适合场景:只想确认某一步的数据对不对,比如刚查完
$users = User::where('active', 1)->get(),立刻dd($users)看集合结构和内容
dump():边看边跑,适合流程追踪
dump() 只负责输出,不加 die 或 exit,执行完继续往下走。当你需要观察变量在多个环节的变化,或者想确认某段逻辑是否真的运行了,它比 dd() 更可靠。
- 可在循环中多次使用:
foreach ($items as $item) { dump($item->id); },每轮都输出,不会卡住 - 配合 echo 或日志更直观:
dump($data); echo '✅ 数据已加载';,页面能看到提示文字 - Blade 中同样用
@dump($posts),不能用双花括号语法
查看 Blade 模板里所有传入变量
不用翻控制器代码,就能快速掌握视图接收到什么数据。两种方式各有所长:
-
{{ dd(get_defined_vars()) }}:显示当前作用域全部变量,包括$loop、$__env、$__data和你传的$users等,信息全但略杂 -
{{ dd($__data) }}:只展示控制器通过view('xxx', [...])显式传递的键值对,结构干净,适合排查“变量未定义”问题
调试 Eloquent 查询时的常见坑
直接 dd($query->toSql(), $query->getBindings()) 往往拿不到绑定参数,因为查询没执行,绑定值还没生成。
- 安全做法:先执行再看,如
dd($query->get()->toArray())(注意副作用) - Laravel 10.42+ 推荐用
dd($query->toRawSql()),一次拿到带填充参数的完整 SQL - 若需结构+参数分离,改用
$raw = $query->toBase(); dd($raw->toSql(), $raw->getBindings());











