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
相关产品推荐
相关产品推荐

