Lumen框架中maatwebsite/excel 3.0无法正常使用问题咨询
解决Lumen中使用maatwebsite/excel 3.0生成XLS的错误及存储位置问题
嘿,我来帮你搞定这个问题,咱们一步步来拆解:
一、错误原因及解决步骤
你碰到的Target [Illuminate\Contracts\Routing\ResponseFactory] is not instantiable错误,其实是两个问题叠加导致的:
- API版本不兼容:你用的是maatwebsite/excel 3.0,但写的是2.x版本的
Excel::create代码——3.0已经完全重构了导出API,这个方法早就被移除了! - Lumen缺少响应工厂绑定:Lumen默认没绑定
Illuminate\Contracts\Routing\ResponseFactory这个契约,而Excel包需要它来生成下载响应。
下面是具体的修复步骤:
1. 重写导出代码(适配3.0版本)
3.0版本改用导出类的方式来生成Excel,操作很简单:
- 先在项目里创建
app/Exports目录(没有的话手动建),然后新建一个导出类:
namespace App\Exports; use Maatwebsite\Excel\Concerns\FromArray; use Maatwebsite\Excel\Concerns\WithHeadings; class LoginsExport implements FromArray, WithHeadings { protected $data; // 构造函数传入要导出的数据 public function __construct(array $data) { $this->data = $data; } // 把stdClass对象转成数组,让Excel能读取 public function array(): array { return array_map(fn($item) => (array)$item, $this->data); } // 设置Excel的表头,你可以改成自己需要的中文或英文 public function headings(): array { return [ '序号', '用户名称', '登录时间', '用户名' ]; // 要是想直接用字段名,就返回:['srNum', 'user_name', 'loggedin_at', 'username'] } }
- 然后在控制器里用3.0的正确API写法:
use App\Exports\LoginsExport; use Maatwebsite\Excel\Facades\Excel; public function exportLogins() { $data = // 你的包含stdClass对象的数组 // 先实例化导出类 $export = new LoginsExport($data); // 把文件存储到服务器 Excel::store($export, 'Laravel Excel.xls', 'local'); // 同时返回下载响应给用户 return Excel::download($export, 'Laravel Excel.xls'); }
2. 给Lumen绑定响应工厂
打开bootstrap/app.php,添加以下代码:
// 先确保开启了Facades(如果之前没开的话) $app->withFacades(); // 绑定ResponseFactory契约,解决实例化错误 $app->bind(Illuminate\Contracts\Routing\ResponseFactory::class, function ($app) { return new Illuminate\Routing\ResponseFactory( $app->make(Illuminate\Contracts\View\Factory::class), $app->make(Illuminate\Routing\Redirector::class) ); }); // 确认你已经注册了Excel服务提供者(这步你已经做了,检查下就行) $app->register(Maatwebsite\Excel\ExcelServiceProvider::class); // 可选:添加Excel的Facade别名,这样就能直接用`Excel::`调用了 class_alias(Maatwebsite\Excel\Facades\Excel::class, 'Excel');
二、Excel文件的存储位置
maatwebsite/excel默认用Lumen的local磁盘,文件会存在:
storage/app/你的文件名.xls
比如你代码里的Laravel Excel.xls,就会存在storage/app/Laravel Excel.xls。
如果想存到public目录(方便浏览器访问),可以改store方法的第三个参数:
Excel::store($export, 'Laravel Excel.xls', 'public');
这时文件会存在storage/app/public/Laravel Excel.xls,要让外部能访问的话,执行这个命令创建软链接:
php artisan storage:link
之后就能通过http://你的域名/storage/Laravel Excel.xls访问这个文件了。
内容的提问来源于stack exchange,提问作者hetal gohel
相关产品推荐
相关产品推荐

