Laravel 5 - env() 总是返回 null

Posted

技术标签:

【中文标题】Laravel 5 - env() 总是返回 null【英文标题】:Laravel 5 - env() always returns null 【发布时间】:2017-08-31 19:24:01 【问题描述】:

我试图找出为什么我的env() 助手总是返回null。这会导致麻烦,尤其是在 app.php 文件中,env() 默认情况下广泛使用的助手。也许有什么神秘的服务器设置?

我的环境文件

APP_ENV=production
APP_KEY=base64:mymagickey=
APP_DEBUG=false
APP_LOG_LEVEL=info
APP_URL=http://www.example.com

etc...

编辑 - 我尝试了以下

php artisan cache:clear
php artisan view:clear
php artisan config:cache

当然,我正在使用 env 这样的助手:env('APP_ENV')

但仍然没有成功。奇怪的是,$_ENV php 变量包含来自.env 文件的每个变量。

【问题讨论】:

【参考方案1】:

记得检查您的.env 文件是否有重复的变量声明

STRIPE_PUBLISHABLE_KEY="why-wont-this-key-get-outputted"

#...

# Because at the bottom of the .env file it is unset like this
STRIPE_PUBLISHABLE_KEY=

【讨论】:

【参考方案2】:

很遗憾,公认的解决方案没有为这个问题提供合适的解决方案!

案例:由于Laravel 5.2,如果你直接调用env("key"),如果你最后一个命令执行php artisan config:cache,它总是返回null

接受的答案说:执行php artisan config:clear 作为解决问题的最后一条命令! 这不是解决方案!,因为我们需要始终将php artisan config:cache 作为最后一个命令执行..

那么解决办法是什么?

这里我需要解释两种情况的解决方案:


案例 1(预定义键):如果您需要从 Laravel 项目创建的 .env 文件中获取值(默认 .env 文件),或者您已经安装了它的第三方插件并按照正确的安装程序进行安装:

    获取.env文件中列出的键名并在laravel_root/config文件夹的文件中搜索它(记住:config文件夹中的所有文件都以数组形式返回结果),例如我搜索APP_URL由 Laravel 项目默认定义:

正如你在这里所说,我在两个配置文件中找到了两个结果,一个在 filesystem.php 中,另一个在 app.php 中,因此要在任何 php(类或视图文件等)中获取这些值中的任何一个你的 laravel 项目就这样称呼它:

对于我们在app.php 文件中找到的结果,通过以下方式获取它的值:

config('app.env');

这里app是php文件名,env是app.php文件结果返回的数组键。

对于我们在filesystems.php 文件中找到的结果,通过以下方式获取它的值:

config('filesystems.public.url');

这里filesystems是php文件名,public是key(一级)url是key(二级)作为filesystems.php 文件的结果返回的数组。

案例总结:如果你需要在 Laravel 项目的任何 php 文件中获取 APP_URL 的值,你可以得到 它通过调用config('app.env')函数,是否最后执行的命令 是php artisan config:clearphp artisan config:cache,它 一点都不重要。


案例 2(非预定义密钥 - 如果您需要生成新的自定义环境密钥):请参阅此答案以了解说明:https://***.com/a/69707739/2877427

【讨论】:

【参考方案3】:

php 工匠配置:清除。 请运行此命令,它将清除配置缓存。 它的发生是因为配置文件被缓存并且在缓存时值必须为空。

【讨论】:

【参考方案4】:

只需在您的 Laravel 项目根目录下运行此命令

rm bootstrap/cache/config.php

【讨论】:

多么神奇 【参考方案5】:

如果接受的答案不能解决问题,请检查 .env 文件是否具有正确的读写权限。如果框架/库无法读取文件,则值将始终为空。我在我的一个 Lumen 项目中遇到过这个问题,但在更改文件权限后它就起作用了。

【讨论】:

【参考方案6】:

将 .env 文件放在项目的根文件夹中

将这些添加到 app.php 文件中。

try 
    (new Dotenv\Dotenv(__DIR__.'/../'))->load();
 catch (Dotenv\Exception\InvalidPathException $e) 
    echo $e;

【讨论】:

【参考方案7】:

我知道这是一个非常古老的线程,原因可能不一样。但同样的问题也发生在我身上。

原因是我在 .env 文件中遇到了问题。这就是我在 .env 中得到的

TEST="e@1asa

请注意缺少结尾引号。应该是这样的,

TEST="e@1asa"

由于这个错误,我添加的所有 env 变量都返回了 null。

甚至没有写入错误日志。因此,如果您遇到此错误尝试添加一个示例环境变量作为文件的第一条记录。如果它工作并且记录最后不工作可能是.env里面有错误

【讨论】:

【参考方案8】:

以下命令对我有用。 我不小心清除了所有缓存文件,所以env('something') 返回了 null。

php artisan optimize:clear

【讨论】:

谢谢!!今天突然发生在我身上-Laravel 8。这解决了它。 这是在 Laravel 8 上对我有用的唯一答案。无法获得 env 值让我抓狂。非常感谢。【参考方案9】:

如果您的 Laravel 在 .env 或数据库文件夹中进行一些修改后或由于任何其他修改而无法正常工作,则需要五个最重要的命令。 这是完整的解释: https://www.youtube.com/watch?v=Q1ynDMC8UGg

php artisan config:clear
php artisan cache:clear
php artisan view:clear
php artisan route:clear
composer dump-autoload

【讨论】:

这里有同样的问题....不工作 env()。我试过删除缓存,作曲家转储自动加载....等。我正在使用 laravel 5.5.44,我必须使用 \Config::get() 从 .env 文件中调用配置 我已经在一个地方列出了您需要运行的所有命令,以消除 env 文件或配置等的任何类型的缓存问题。这是线程:***.com/a/43041479/6935763 请运行所有命令并如果它仍然不起作用,请告诉我。 只运行php artisan config:cache 不起作用。在我运行php artisan config:clear 之后,它就可以工作了。现在我可以再次使用 env($key)。谢谢@Learner 我阅读了您的讨论并将我的解释放在单独的答案中,请查看。【参考方案10】:

env(...) 功能在缓存配置后将不起作用。 (从 laravel 5.2 到当前 5.7)

Laravel documentation 说

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

所以正确的答案是

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

我从同一个documentation引用它

但为了快速修复,这样做可以:

php artisan config:clear

现在应该清楚为什么,当您尝试 config:cache 时,它没有帮助,即使它在缓存之前清除了配置。

【讨论】:

谢谢,php artisan config:clear 是唯一可以读取我的 AWS SES 凭证的方法。 所以我认为我们不应该在我们的应用程序中直接使用env('APP_ENV') 之类的东西。相反,我们应该在config/app.php 中写一行:'env' => env('APP_ENV'),。然后,我们在代码中使用它:config('app.env'). @cosmos 对于任何阅读本文的人,总是这样做,env 仅在任何config/*.php 文件中有用,绝不在外面!!!! ""config" 命名空间中没有定义命令。" Laravel 仍然不读取 .env 文件【参考方案11】:

希望这条命令能救你

php 工匠配置:清除

【讨论】:

【参考方案12】:

使用\Config::get('app.env'); 而不是env(APP_ENV);,因为您最终会遇到同样的错误,这对实时网站不利。

如果您想从您的 ENV 添加自定义变量,请进入您的配置应用并找到以下内容:

/*
    |--------------------------------------------------------------------------
    | Application Environment
    |--------------------------------------------------------------------------
    |
    | This value determines the "environment" your application is currently
    | running in. This may determine how you prefer to configure various
    | services your application utilizes. Set this in your ".env" file.
    |
    */

'env' => env('APP_ENV', 'production'),

在“'env' => env('APP_ENV', 'production'),”下添加一个新行,例如,它可能如下:

/*
    |--------------------------------------------------------------------------
    | Application Environment
    |--------------------------------------------------------------------------
    |
    | This value determines the "environment" your application is currently
    | running in. This may determine how you prefer to configure various
    | services your application utilizes. Set this in your ".env" file.
    |
    */

'env' => env('APP_ENV', 'production'),
'key' => env('APP_KEY'),

你可以这样调用“key”变量:

\Config::get('app.key');

每当您向应用程序环境添加“key”等新变量时,您都需要使用config:cache 来重置缓存。

【讨论】:

我不确定,但可能这个错误只发生在 Windows 中。但是您的解决方案也在 Windows 中解决了它。能在linux生产环境下工作吗? @AmitShah,这不是错误,而是一项功能。详情请查看我的回答。【参考方案13】:

这是一个“.env”已知的错误,可以通过以下方式解决:

php artisan config:cache

【讨论】:

有些用户可能需要做 php artisan config:clear 代替 Laravel 5.5 我必须运行 'php artisan config:clear'。谢谢 php artisan config:cache 是 env() 值为空的原因。如果你想缓存你的配置和环境变量,那么你不应该在除了配置文件之外的任何地方使用 env(),因为一旦缓存 env() 将总是返回 null。虽然现在我也看到 config() 和 Config::get() 帮助器在缓存后返回 null,这也很奇怪。 跟进上述内容 - ...所以你应该意识到 config() 助手也不能直接访问 .env 中的值。您将需要创建或使用现有的 config/.php 配置文件并从 .env 创建配置条目,然后使用该映射值。

以上是关于Laravel 5 - env() 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 没有使用正确的 .env 值

Laravel 5.4 护照 axios 总是返回 Unauthenticated

为啥 Auth::attempt 在 Laravel 5.3 中总是返回 false?

Laravel 5 response()->json 总是返回一个数组?

Laravel 5 Auth::attempt() 总是返回 false

Laravel .env 文件返回错误数据