在初始化配置之前更改存储路径,但仍使用env()

时间:2019-01-08 15:49:22

标签: php laravel laravel-5.7

设置要运行Laravel的IIS服务器。需要设置存储路径以指向映射到Z的网络驱动器:

由于我需要对此进行配置,因此我想通过.env文件来完成此操作。

我尝试使用AppServiceProvider之类的东西通过$app->useStoragePath(config('app.storage_path'));进行设置。

这确实在使用dump(storage_path())时将存储路径设置为所需目录。但是,问题是在AppServiceProvider更改目录之前设置了文件系统配置。因此,Storage::disk()最后使用默认目录进行存储。

然后我尝试将$app->useStoragePath(env('APP_STORAGE_PATH', storage_path()));放入bootstrap/app.php文件中。显然,这不起作用,因为env()函数始终在此处返回null。我意识到Laravel尚未初始化\Dotenv\Dotenv软件包,因此它没有读取.env文件。

为解决此问题,我将此代码添加到bootstrap/app.php-

/**
 * Initializing dotenv here, because we need configurable storage path
 */
$dotEnv = new \Dotenv\Dotenv(__DIR__ . '\\..\\');
$dotEnv->load();
$app->useStoragePath(env('APP_STORAGE_PATH', storage_path()));

这确实有效,但是我不确定这是否是最好的解决方案,因为Laravel可能会在某个时候再次初始化.env。所以我想知道这是否是一个好的解决方案?还是有更好的一个?

感谢您的回复!

2 个答案:

答案 0 :(得分:0)

您可以这样设置config/filesystems.php

// ...
'default' => 'network',
// ... 
'disks' => [
    'network' => [
        'driver' => 'local',
        'root' => env('APP_STORAGE_PATH', storage_path('app')),
    ],
    //...other disk configs
],

然后您可以将APP_STORAGE_PATH中的.env设置为Z://path/to/app/storage或任何您需要的值。

如果需要切换到其他磁盘,可以执行以下操作:

return Storage::disk('local')->get('a file.pdf');

答案 1 :(得分:0)

我和@Ishmael一起在评论中提供了答案,并且我使用System Environment Variable来消除在每个请求上加载.env文件的需要。

所以我刚刚在bootstrap/app.php

$app->useStoragePath(env('APP_STORAGE_PATH', storage_path()));