Laravel 11升级后报错:Undefined array key 'driver' 求解决方案
Laravel 11升级后运行php artisan报"Undefined array key 'driver'"错误解决办法
问题现象
运行php artisan时触发以下错误:
Undefined array key "driver"
at vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php:117
113▕ * @return bool
114▕ /
115▕ protected function shouldServeFiles(array $config)
116▕ {
➜ 117▕ return $config['driver'] === 'local' && ($config['serve'] ?? false);
118▕ }
119▕
120▕ /*
121▕ * Get the default file driver.
调试过程
查看报错对应的函数:
/** * Determine if the disk is serveable. * * @param array $config * @return bool */ protected function shouldServeFiles(array $config) { return $config['driver'] === 'local' && ($config['serve'] ?? false); }
打印传入该函数的$config数组:
array:3 [ "driver" => "local" "root" => "/var/www/html/storage/app" "throw" => false ]
用dd()输出条件判断结果,返回false:
dd($config['driver'] === 'local' && ($config['serve'] ?? false));
临时修改vendor文件让该函数返回false可正常运行,但这不是规范解决方案。
相关配置
当前filesystems.php中的s3配置采用嵌套结构:
's3' => [ 'blog' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => 'blog', 'url' => env('AWS_URL').'/blog', 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', true), 'throw' => true, ], 'verifications' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => 'verifications', 'url' => env('AWS_URL').'/verifications', 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', true), 'throw' => true, ], // 其他s3子配置省略... ],
解决办法
问题根源是Laravel 11不支持将多个s3磁盘嵌套在s3父节点下,正确的做法是将每个s3子磁盘配置直接平级放在disks数组中:
修改filesystems.php的disks部分:
'disks' => [ // 保留原有local、public等磁盘配置... 'blog' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => 'blog', 'url' => env('AWS_URL').'/blog', 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', true), 'throw' => true, ], 'verifications' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => 'verifications', 'url' => env('AWS_URL').'/verifications', 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', true), 'throw' => true, ], // 其他原s3下的子磁盘配置依次平级移出... ],
修改完成后,Laravel可正确识别每个磁盘的driver配置,错误即可解决。
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

