问下laravel 的 env() 函数为啥获取不到 .env 里面的值?

我在控制器里面使用
env(‘url’);//获取不到url的值,但是我在.env里面明明已经设置了url的值了。
然后我在 config/app.php 里面设置了 ‘url’ => env(‘url’, ‘’)
然后我用php artisan cache:clear 后在 bootstarp 里面的 config.php 里面是能看到 url的值的?
为啥到了控制器里面获取不到,配置文件里面能获取到的?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 9
Slowlyo

file

10个月前 评论

避免在app/config/*目录外使用env函数

在 Laravel 中,如果执行 php aritisan config:cache 命令 (生产环境为了提高配置加载速度),Laravel 将会把 app/config 目录下的所有配置文件 “编译” 整合成一个缓存配置文件到 bootstrap/cache/config.php,每个配置文件都可以通过 env 函数读取环境变量,这里是可以读取的。但是一旦有了这个缓存配置文件,在其他地方使用 env 函数是读取不到环境变量的,所以返回 null.

让我们看看这段代码,Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php line 25:

    public function bootstrap(Application $app)
    {
        if ($app->configurationIsCached()) {
            return;
        }

        $this->checkForSpecificEnvironmentFile($app);

        try {
            $this->createDotenv($app)->safeLoad();
        } catch (InvalidFileException $e) {
            $this->writeErrorAndDie($e);
        }
    }

这个方法在框架启动后就会运行,这段代码说明了如果存在缓存配置文件,就不会去设置环境变量了,配置都读缓存配置文件,而不会再读环境变量了。

因此,在配置文件即 app/config 目录下的其他地方,读取配置不要使用 env 函数去读环境变量,这样你一旦执行 php artisan config:cache 之后,env 函数就不起作用了。所有要用到的环境变量,在 app/config 目录的配置文件中通过 env 读取,其他地方要用到环境变量的都统一读配置文件而不是使用 env 函数读取。

更多注意事项可在这里查看 www.kancloud.cn/wenshunbiao/wenshu...

10个月前 评论

这是因为缓存了,除了在config里面用 env,其它的地方读取配置的时候统一使用config函数

public function bootstrap(Application $app){
    if(!$app->configurationIsCached()){
        $this->checkForSpecificEnvironmentFile($app);

        try{
            (newDotenv($app->environmentPath(),$app>environmentFile()))->load();
        }catch(InvalidPathException$e){

        }
    }
}
10个月前 评论
donggan (楼主) 10个月前
cccyzloong (作者) 10个月前

骚操作啊

10个月前 评论
sanders

生成配置缓存会导致 env 取不到数据,生产环境一般都会生成配置缓存。正确的做法是除了配置和服务提供者中使用 env 函数,其他地方请使用 config 函数替代。

10个月前 评论

把你参数放到 config app下面加个你用的参数就好了么

10个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!