Laravel 调试栏影响 Excel 下载
Laravel Debugbar Affecting Excel Download
所以我今天安装了 Laravel Debugbar,试图让我的本地开发人员获得更好的体验,并且在大多数情况下,它确实如此。但是,当我尝试下载从 PhpOffice\PhpSpreadsheet (https://phpspreadsheet.readthedocs.io/en/latest/) 生成的 Excel 时出现了一个问题,这是有问题的代码片段:
$excelFile = new Spreadsheet();
// Load stuff from DB in Sheets, etc. etc.
$writer = new Xlsx($excelFile);
$filename = 'testing.xlsx';
$writer->save('php://output');
效果很好,内容可以毫无问题地加载到 .xlsx
文件中并下载。当我打开文件时,我收到此警报:
We found a problem with some content in 'testing.xlsx'. Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes.
我单击“是”,然后收到此警报:
Excel was able to open the file by repairing or removing the unreadable content.
我单击“删除”并打开我的文件,没有删除任何内容(将文件与 master
分支上的先前提交进行比较,没有变化)。
现在是有趣的部分,我只在启用调试栏时收到此警报。在 .env
中,我有 DEBUGBAR_ENABLED=true
,如果我将其设置为 DEBUGBAR_ENABLED=false
和 reload/redownload,我不会收到警报。有没有人见过这个问题?为什么 Debugbar 会搞砸这个?是不是$writer->save('php://output');
被Debugbar注入污染的问题?
旁注,这在 production
中不是问题,因为 Debugbar 是 require-dev
依赖项,但我只是好奇我是否可以在本地开发期间避免这种情况。
显然,这已在官方文档中进行了询问和回答;只是有点难找。我对通过调试栏的对象污染是正确的,简单的解决方案是在 $writer->save();
:
之后添加 exit();
$excelFile = new Spreadsheet();
// Load stuff from DB in Sheets, etc. etc.
$writer = new Xlsx($excelFile);
$filename = 'testing.xlsx';
$writer->save('php://output');
exit();
还有一些关于 ob_clean()
and/or ob_end_clean()
、ob_flush()
等的注释,但是 none 与 Laravel + 调试栏。供参考:
https://github.com/PHPOffice/PhpSpreadsheet/issues/217
旁注,这会阻止 Debugbar 处理与 Excel 下载相关的 GET
或 POST
请求,因此需要一些让步。简单地在本地注释掉 exit()
将允许调试,但 Excel 将被标记为已损坏。使用 exit()
的简单重复操作将处理。
所以我今天安装了 Laravel Debugbar,试图让我的本地开发人员获得更好的体验,并且在大多数情况下,它确实如此。但是,当我尝试下载从 PhpOffice\PhpSpreadsheet (https://phpspreadsheet.readthedocs.io/en/latest/) 生成的 Excel 时出现了一个问题,这是有问题的代码片段:
$excelFile = new Spreadsheet();
// Load stuff from DB in Sheets, etc. etc.
$writer = new Xlsx($excelFile);
$filename = 'testing.xlsx';
$writer->save('php://output');
效果很好,内容可以毫无问题地加载到 .xlsx
文件中并下载。当我打开文件时,我收到此警报:
We found a problem with some content in 'testing.xlsx'. Do you want us to try to recover as much as we can? If you trust the source of this workbook, click Yes.
我单击“是”,然后收到此警报:
Excel was able to open the file by repairing or removing the unreadable content.
我单击“删除”并打开我的文件,没有删除任何内容(将文件与 master
分支上的先前提交进行比较,没有变化)。
现在是有趣的部分,我只在启用调试栏时收到此警报。在 .env
中,我有 DEBUGBAR_ENABLED=true
,如果我将其设置为 DEBUGBAR_ENABLED=false
和 reload/redownload,我不会收到警报。有没有人见过这个问题?为什么 Debugbar 会搞砸这个?是不是$writer->save('php://output');
被Debugbar注入污染的问题?
旁注,这在 production
中不是问题,因为 Debugbar 是 require-dev
依赖项,但我只是好奇我是否可以在本地开发期间避免这种情况。
显然,这已在官方文档中进行了询问和回答;只是有点难找。我对通过调试栏的对象污染是正确的,简单的解决方案是在 $writer->save();
:
exit();
$excelFile = new Spreadsheet();
// Load stuff from DB in Sheets, etc. etc.
$writer = new Xlsx($excelFile);
$filename = 'testing.xlsx';
$writer->save('php://output');
exit();
还有一些关于 ob_clean()
and/or ob_end_clean()
、ob_flush()
等的注释,但是 none 与 Laravel + 调试栏。供参考:
https://github.com/PHPOffice/PhpSpreadsheet/issues/217
旁注,这会阻止 Debugbar 处理与 Excel 下载相关的 GET
或 POST
请求,因此需要一些让步。简单地在本地注释掉 exit()
将允许调试,但 Excel 将被标记为已损坏。使用 exit()
的简单重复操作将处理。