4

我将 Laravel 6.x 用于客户的项目,其中我在 Artisan Command 中构建了一个用于同步数据的 API。

现在客户希望配置谨慎,远离主要源代码,并且尽可能没有任何后备值。这意味着我必须在.env文件中定义配置并使用env()没有任何回退默认值的方法。

env这在 Laravel Artisan 命令类文件中必须是可能的,但是当我使用以下代码中的方法时,它无法按预期工作:

[站点根目录]\.env:

APP_ENV=local

[站点根目录]\app\Console\Commands\SyncSomeData.php:

use Illuminate\Console\Command;

class SyncSomeData extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sync:some-data';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        exit(env('APP_ENV','staging1'));
    }
}

这总是staging1在控制台中打印,如果我使用它而不是给定的env方法,那么它什么也不打印:

exit(env('APP_ENV'));

据我所知并且可以相信 Laravel 是最安全的,必须有办法让env命令文件中没有后备值的方法工作,任何人都可以帮助实现这一点吗?

4

1 回答 1

4

这个答案有几个部分。

  1. 缓存配置

仅当您在本地环境中缓存了配置时,才会出现此问题中的问题。如果你曾经运行过php artisan config:cacheor php artisan optimize,你已经缓存了你的配置。

因此,laravel 将不再读取您的 .env 文件并从缓存中加载 config 和 .env 的所有值。

最好不要在整个应用程序中使用 env() 而是为这些值创建配置文件。这将加快您在生产中的应用程序。如果你想利用配置缓存,你不能在配置文件中的任何地方使用 env()。

在您的本地环境中,文档建议您不要缓存您的配置,因为它会经常更新。我认为这是一个很好的建议,但有一个警告:env()。如果您没有在本地缓存您的配置,而是在生产中,您将不会遇到像在本地发布这篇文章那样的错误。如果你有一个 ci 管道和良好的测试实践,那么这个障碍就会被克服。

如果您坚持在本地使用缓存配置,则每次更新配置文件或 .env 文件时,您都需要运行php artisan config:cache.

  1. 禁用配置缓存

通过运行php artisan config:clear或删除/bootstrap/cache/config.phplaravel 将不再尝试从缓存中读取配置,并且 .env 将在配置文件之外工作。如果您这样做,正如我在 (1) 中所述,如果您在生产中缓存配置,请确保您的管道中有一部分将捕获这些错误。

在与 OP 进行更多讨论后,我将再澄清一件事:

缓存配置不会自动缓存您的 .env 键,因此您可以像 config('SOME_CUSTOM_DOT_ENV_KEY') 一样访问它们。使用缓存配置时,如果您需要访问应用程序内部的环境变量,则必须在配置文件中引用它们。

同样,一旦启用配置缓存,.env 就变得无用,但它用于构建缓存。

因此,如果您在 .env 中说:

GOOGLE_API_TOKEN=xxxx

您可能会创建一个配置文件,例如:

谷歌.php

return [
    'api_token' => env('GOOGLE_API_TOKEN', 'some-default-value'),
];

在您的应用程序中,您只会引用 config('google.api_token') 而不会引用 env('GOOGLE_API_TOKEN')。

于 2020-07-09T17:46:02.230 回答