Laravel 5.0自定义配置变量获取失败问题求助
首先明确说:你完全可以在config/app.php中添加自定义配置变量,出现返回null的情况大概率是配置结构、缓存或者调用方式的问题,下面一步步帮你排查解决:
1. 检查配置变量的结构是否正确
Laravel的config/app.php对应的配置命名空间是app,所以你的自定义变量必须直接放在返回的根数组里,不能嵌套在其他无关键下面。举个正确的例子:
// config/app.php return [ // 这里是Laravel默认的配置项,比如debug、url、locale等 'debug' => env('APP_DEBUG', false), 'url' => env('APP_URL', 'http://localhost'), // 你的自定义配置变量,直接放在根数组里 'languages' => [ 'en' => 'English', 'fr' => 'French', 'zh-CN' => '简体中文' ], ];
如果你把languages嵌套在了比如'custom' => ['languages' => ...]里面,那你需要用Config::get('app.custom.languages')(或者config('app.custom.languages'))来获取,而不是直接Config::get('languages')。
2. 清除配置缓存(非常重要!)
Laravel 5.0支持配置缓存,如果你之前执行过php artisan config:cache,修改配置文件后新的内容不会生效,必须先清除缓存。在终端运行:
php artisan config:clear
如果之后需要重新缓存配置(生产环境建议开启),再运行:
php artisan config:cache
开发环境不建议缓存配置,否则每次修改配置都要清缓存,很麻烦。
3. 尝试用辅助函数替代Facade调用
在Blade视图里,除了用Config::get('languages'),你可以试试Laravel提供的辅助函数config('languages'),有时候Facade的加载顺序在视图中可能出现小问题,辅助函数更简洁也更可靠:
{{-- resources/views/frontend/includes/menus/guest.blade.php --}} @if(config('languages')) @foreach(config('languages') as $code => $label) <li><a href="/lang/{{ $code }}">{{ $label }}</a></li> @endforeach @endif
加个@if判断可以避免foreach接收null的报错,更健壮。
4. 确认当前环境的配置文件是否覆盖了你的变量
Laravel会根据当前环境加载对应目录的配置文件,比如如果你的APP_ENV是local,那么config/local/app.php里的配置会覆盖config/app.php的同名变量。所以检查一下对应环境的app.php文件里有没有定义languages,如果有,确保它的值是你需要的。
按照上面的步骤排查,应该就能解决返回null的问题了。
内容的提问来源于stack exchange,提问作者gdm

