Laravel Excel中能否将$sheets传递至BeforeSheet事件?如何实现?
问题解决:Laravel Excel 中 BeforeSheet 事件获取 $sheets 为空的处理
可以实现传递,你的问题出在局部变量的作用域与引用失效上。原代码中$sheets是registerEvents方法内的局部变量,当方法执行完毕后该变量会被销毁,导致BeforeSheet闭包中的引用指向空值。
解决方案:将 $sheets 改为类成员属性
把$sheets定义为类的成员变量,避免作用域问题,直接通过$this在事件闭包中访问。
修改后的完整代码:
<?php namespace Modules\CustomerTransactionSummaries\Exports; class AccountabilityMultiSheetExport implements WithEvents { use Exportable, RegistersEventListeners; protected $dateFrom, $dateTo, $customers, $farm; // 添加类成员属性存储工作表列表 protected $sheets = []; public function __construct(string $dateFrom, string $dateTo, array $customers, Model $farm) { $this->dateFrom = $dateFrom; $this->dateTo = $dateTo; $this->customers = $customers; $this->farm = $farm; } public function registerEvents(): array { return [ BeforeWriting::class => function (BeforeWriting $event) { $templateFile = new LocalTemporaryFile(storage_path('app/utilities/accountability.xlsx')); $event->writer->reopen($templateFile, \Maatwebsite\Excel\Excel::XLSX); // 直接赋值给类成员属性 $this->sheets = $event->writer->getSheetNames(); foreach ($this->sheets as $key => $value) { $event->writer->getSheetByIndex($key)->export($event->getConcernable()); } return $event->getWriter(); }, BeforeSheet::class => function (BeforeSheet $excel) { $sheet = $excel->sheet; // 直接通过$this访问工作表列表,按需使用 // 示例:判断当前工作表是否在目标列表中 // if (in_array($sheet->getTitle(), $this->sheets)) { ... } $summary = new Summaries($this->dateFrom, $this->dateTo, $this->customers, $this->farm); $summary->printExcel($sheet->getTitle(), $sheet); }, ]; } }
原理说明
- 原代码中局部变量
$sheets在registerEvents执行完成后立即被释放,BeforeSheet闭包的引用指向已销毁的变量,因此获取到空数组。 - 改用类成员属性后,只要
AccountabilityMultiSheetExport实例存在,$sheets就会保持有效,事件闭包可以通过$this稳定访问。
内容的提问来源于stack exchange,提问作者user19991216
相关产品推荐
相关产品推荐

