在 Laravel 中重新加载自定义 .env 文件后如何更改存储设置?

Posted

技术标签:

【中文标题】在 Laravel 中重新加载自定义 .env 文件后如何更改存储设置?【英文标题】:How to change storage settings after reload custom .env file in Laravel? 【发布时间】:2021-05-11 07:31:02 【问题描述】:

我在AppServiceProvider 中加载了我的自定义.env.custom 文件后遇到了这个问题:

class AppServiceProvider extends ServiceProvider

    // ...

    public function boot()
    
        $host = request()->getHost();

        // read domain based .env file, like: .env.example.com
        $dotenv = \Dotenv\Dotenv::createMutable(base_path(), '.env.' . $host);
        $dotenv->load();
    

(我也尝试了\Dotenv\Dotenv::createImmutable(),结果相同。)

然后在控制器中:

dd(
    env('S3_ENDPOINT'),
    Storage::disk('s3'),
);

env() 返回新值,但Storage::disk('s3') 包含旧值。

如何强制整个 Laravel 系统从 .env.custome 文件重新加载配置?

【问题讨论】:

您尝试php artisan config:cache 清除并重建配置缓存了吗?详情请见Laravel docs。 在加载环境后尝试做Artisan::call('config:clear');,我认为你的新值没有加载到配置中 我有几个 .env 文件,每个文件都包含特定域的配置。在 Laravel 加载 .env 文件后,它应该重新加载主机名上的特定 env 文件(例如从此文件:.env.example.com)。 config:cacheconfig:clear 是命令行工具,但我在运行时加载了我指定的 .env 文件。 为了节省时间,所有配置的缓存都是 laravel 保存的,所以 config/filesystems.php 中的 s3 值已经存储了,所以你需要清除缓存,就像我说的 Artisan::call('config:clear');你可以使用工匠类来清除配置,如果你不想使用Config::set('filesystems.disks.s3', put your env value here); 我在Dotenv::createMutable() 代码之前尝试了Artisan::call('config:clear');,但没有任何改变。 【参考方案1】:

有两种方法

1。使用 Artisan 类清除缓存

但它会清除缓存并再次添加并需要一些时间。

 $host = request()->getHost();
 $dotenv = \Dotenv\Dotenv::createMutable(base_path(), '.env.' . $host);
 $dotenv->load();
 // clear it after loading the env
 Artisan::call('config:clear'); // if gives error Artisan class not found then use \Artisan::call('config:clear');

2。设置特定的配置

更好的是,您不会只更改您想要更改的所有配置文件。将花费更少的时间。

$host = request()->getHost();
$dotenv = \Dotenv\Dotenv::createMutable(base_path(), '.env.' . $host);
$dotenv->load();
Config::set('filesystems.disks.s3', env("S3_ENDPOINT"));

【讨论】:

以上是关于在 Laravel 中重新加载自定义 .env 文件后如何更改存储设置?的主要内容,如果未能解决你的问题,请参考以下文章

关于Lumen / Laravel .env 文件中的环境变量是如何生效的

PHPUnit env中的Laravel自定义FormRequest

自定义环境中运行应用程序中的 Grails 自动重新加载功能

laravel中env底层加载和解析原理

从自定义路径预加载 env 文件

在 Laravel 7 中自动加载自定义包