You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP+Dompdf生成PDF变量传递报错:Undefined variable: contracts

解决Laravel + Dompdf 中「Undefined variable: contracts」的错误

嘿,我来帮你搞定这个变量未定义的问题!咱们一步步排查代码里的问题:

1. 先修正路由配置错误

你当前的路由写法逻辑混乱,Route::get不能同时直接返回视图又指定控制器方法,应该直接指向控制器的对应处理方法:

Route::get('/blank', [PdfGenerateController::class, 'pdfview'])->name('viewpdf');

(记得在文件顶部引入PdfGenerateController哦)

2. 修复控制器的变量传递逻辑

你在控制器里用PDF::loadView('sell.contractpdf', $contract)的写法不对,loadView的第二个参数必须是关联数组,要明确绑定视图里要用的变量名和对应的值。另外你视图里用的是$contracts(复数),但控制器查出来的是单个$contract(单数),这里要统一:

场景1:你需要传递单个合同数据

控制器代码改成这样:

public function pdfview(Request $request) {
    $contract = Contract::findOrFail(session('contract_id'));
    // 把单个合同以$contract的变量名传给视图
    $pdf = PDF::loadView('sell.contractpdf', ['contract' => $contract]);
    return $pdf->stream();
}

对应的视图也要改成单个变量的用法:

<h1>合同详情</h1>
<h4>{{ $contract->id }}</h4>

场景2:你需要传递合同集合(遍历多个合同)

如果视图里确实要遍历$contracts,那控制器要查询集合并传递对应变量名:

public function pdfview(Request $request) {
    // 根据业务需求查询合同集合,比如关联当前会话的合同
    $contracts = Contract::where('related_id', session('contract_id'))->get();
    $pdf = PDF::loadView('sell.contractpdf', ['contracts' => $contracts]);
    return $pdf->stream();
}

这样视图里的@foreach ($contracts as $contract)就能正常运行了。

3. 额外检查项

  • 可以在控制器里用dd(session('contract_id'))确认会话里的ID是否存在,避免因查询不到数据引发的连锁问题;
  • 确认Dompdf的服务提供者和门面已经在config/app.php中正确注册(如果是手动安装的话)。

内容的提问来源于stack exchange,提问作者user9820353

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:52:19