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 下载相关的 GETPOST 请求,因此需要一些让步。简单地在本地注释掉 exit() 将允许调试,但 Excel 将被标记为已损坏。使用 exit() 的简单重复操作将处理。