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

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);
            },
        ];
    }
}

原理说明

  1. 原代码中局部变量$sheets在registerEvents执行完成后立即被释放,BeforeSheet闭包的引用指向已销毁的变量,因此获取到空数组。
  2. 改用类成员属性后,只要AccountabilityMultiSheetExport实例存在,$sheets就会保持有效,事件闭包可以通过$this稳定访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:55:26