首页 > 解决方案 > 在初始化配置之前更改存储路径但仍使用 env()

问题描述

设置将运行 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在某个时候再次初始化。所以我想知道这是否是一个好的解决方案?还是有更好的?

感谢您的回复!

标签: phplaravellaravel-5.7

解决方案


你可以config/filesystems.php这样设置:

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

然后你可以设置APP_STORAGE_PATH你的.envtoZ://path/to/app/storage或任何你需要的。

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

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

推荐阅读