Laravel .env变量始终返回null。

11

我将这个变量添加到 .env 文件中:

STRIPE_SECRET=a12345

我希望能够使用 routes/web.php 来导出这个变量。

<?php
dd(env('STRIPE_SECRET'));

但看起来它总是返回null。

更新:更新了.env文件。我只删除了DB_PASSWORD。

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:08txDXXatyYsP5WQ4ECz35Q7OyBEe8Vgb/zK5fZsHik=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
APP_LOCALE=tr
APP_LC_ALL=tr_TR.utf8

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=gunluk
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=03ac580c85842d
MAIL_PASSWORD=1d6d902d296942
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

STRIPE=a123
STRIPE_SECRET=a12345

4
尝试运行以下命令:php artisan config:clear和php artisan optimize。这些命令可以清除配置缓存并优化应用程序性能。 - Vision Coderz
你确定你有应用程序密钥吗?运行 php artisan key:generate 确保后再试一次。 - tptcat
1
你能回答这些问题吗:你的.env文件放在哪里?你尝试过在tinker中执行env("STRIPE")调用吗?其他的env参数是否有效(比如env("APP_NAME"))? - Desh901
1
基本上可能是因为配置被缓存且环境变量没有从.env文件中加载。始终通过config方法在内部访问您的环境变量。要测试,只需运行命令 php artisan config: clear 并重试以上测试。 - Desh901
1
可能是Laravel 5.3 - env()始终返回null的重复问题。 - Yevgeniy Afanasyev
显示剩余8条评论
8个回答

22
你遇到的主要问题是你缓存了配置。当你运行 php artisan config:cache 命令时,会将配置文件存储在缓存中。下一次 Laravel 启动时,它不会读取 .env 文件,因为它检测到配置已经存储在缓存中。环境文件只应该用于设置配置文件,如果你想访问你需要的值,你应该使用config方法。
假设你有一个名为config/stripe.php的文件,其内容如下:
<?php

return [
    'secret' => env('STRIPE_SECRET', '')
];

运行php artisan config:cache之后,您应该只使用语法config('stripe.secret')访问此值,以便在应用程序代码中使用。每次更新配置文件和.env文件时,您需要再次运行php artisan config:cache


18

首先,在您的.env文件中没有STRIPE_SECRET(根据之前编辑的问题),所以请确保您的.env必须具有此变量。您应该按照相同的顺序执行以下命令来清除配置缓存:

php artisan config:cache
php artisan config:clear 

Laravel缓存配置文件以使执行更快。因此,每次在服务器上更改配置文件时,您都应该清除缓存。

另外,您也可以运行以下命令来清除其他缓存。

php artisan cache:clear   //for clearing the cache
php artisan view:clear    //for clearing the compiled views
php artisan route:clear   //for clearing the routes cache
您还可以为这些命令创建路由,并且还可以从代码中调用这些命令。
Route::get('/cache-clear', function() {
    $exitCode = Artisan::call('cache:clear');
    echo "Cache Cleard: ".$exitCode;
});

Route::get('/view-clear', function() {
    $exitCode = Artisan::call('view:clear');
    echo "View Cleard: ".$exitCode;
});

Route::get('/route-cache', function() {
    $exitCode = Artisan::call('route:cache');
    echo "Route Cached: ".$exitCode;
});

Route::get('/route-clear', function() {
    $exitCode = Artisan::call('route:clear');
    echo "Route Cache Cleared: ".$exitCode;
});

Route::get('/config-cache', function() {
    $exitCode = Artisan::call('config:cache');
    echo "Config Cached: ".$exitCode;
});

Route::get('/config-clear', function() {
    $exitCode = Artisan::call('config:clear');
    echo "Config Cache Cleared: ".$exitCode;
});

11

如果您在.env文件中有STRIPE="a12345",或者如果您对.env文件或config文件进行了任何更改,则按照以下步骤操作。

还有一件事,要像这样在逗号中写入变量值:STRIPE="a12345"

首先运行这些命令

 1. php artisan config:clear
 2. php artisan cache:clear
 3. composer dump-autoload

最后使用此命令获取变量

dd(env('STRIPE'));

这对我起作用了

还有一个愚蠢的建议:重新启动服务器

我已经添加了所有可能的解决方案


1
这对我有用。尝试了步骤1和2多次(来自其他建议),但直到我也尝试了步骤3才起作用。 - user2796515

4
您可以使用以下命令清除配置缓存。
php artisan config:clear 
php artisan optimize
php artisan config:cache

同样要确保

如果您在部署过程中使用 config:cache 命令,则必须确保您只从配置文件中调用 env 函数,而不是从应用程序的任何其他位置调用 env 函数。如果您在应用程序中调用 env,请强烈建议您向配置文件添加适当的配置值,并从该位置调用 env,以允许您将 env 调用转换为 config 调用。

参考链接:

更新 1:

还要确保您已将 .env.example 重命名为默认的 .env file,因为 Laravel 默认情况下有 .env.example

更新 2:

根据您新的更新问题,您的 env 文件具有 STRIPE 而不是 STRIPE_SECRET,因此如果这不是问题中的拼写错误,则可以像这样访问

env('STRIPE')

仍然返回空值。 - user762630
你确定你有 .env 文件而不是 .env.example 吗? - Vision Coderz
当然,我有一个 .env 文件。 - user762630
好的。我已经尝试过环境方法,它对我有用。奇怪的错误。 - Vision Coderz
你能否发布整个环境文件? - Vision Coderz
显示剩余7条评论

1

env(...)函数在您缓存配置后将返回null。(从laravel 5.2到当前的5.7版本)

documentation中提到:

如果您在部署期间使用config:cache命令,则必须确保仅从配置文件中调用env函数,而不是从应用程序的任何其他位置调用。

因此,正确的答案应该是:

如果您从应用程序内部调用env,则强烈建议您将正确的配置值添加到配置文件中,并从该位置调用env,以允许您将env调用转换为config调用。

我从同一个documentation中引用了这句话

但是,要快速修复,可以执行以下操作:

php artisan config:clear


除了运行php artisan config:cache之外,如果必要的话,假设我在我的.env文件中有API_DOMAIN=https://www.someaddress.com/这一行,我应该把它放在哪个文件中?我需要用什么替换我的env('API_DOMAIN')调用? - Ben Kao
如果你觉得懒得话,可以将其放在\config\app.php中;如果你觉得自己正在创建一个新的API服务连接器,则使用\config\services.php;如果你觉得这是一件大事——那就创建你自己的文件吧。 - Yevgeniy Afanasyev

1
我不建议使用env('STRIPE')命令来获取变量。在循环中,此命令在某些迭代后开始返回null。因此,最好创建一个配置文件并使用命令“config('file_name.variable_name)”。
<?php
return [
    'sprite_secret' => env('STRIPE_SECRET', '')
];

首先运行这些命令

php artisan config:cache
php artisan config:clear

使用以下命令获取STRIPE_SECRET变量的值:
config('config_file.sprite_secret)

0
在Linux上运行以下命令: ``` php artisan config:cache && php artisan config:clear && php artisan cache:clear && php artisan view:clear && php artisan route:clear ```
在其他情况下运行以下命令: ``` php artisan config:cache & php artisan config:clear & php artisan cache:clear & php artisan view:clear & php artisan route:clear ```
如需了解更多详细信息,请查阅本文:点击这里

0

确保您的应用程序完全启动。

如果您正在使用cmd运行服务器,则尝试重新启动服务器。

如果仍然无法正常工作,请尝试使用@iCoders上面提到的方法清除缓存。


我应该如何启动应用程序?这个应用程序在我的自己的服务器上运行,所以它最近重新启动了。 - user762630
你正在尝试获取变量的位置。 - Moeen Basra
似乎你的.env文件中有STIPE密钥而不是STRIPE_SECRET。 - Moeen Basra
好像你在上面提到的.env文件中没有STRIPE_SECRET。我猜你想获取STRIPE。 - Moeen Basra
尝试获取 env('STRIPE') 不要使用 getenv('STRIPE') 你将得到该值 - Moeen Basra
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接