Laravel 在运行时更改文件系统磁盘路径

标签 laravel laravel-facade laravel-storage

我知道 filesystems.php 可以创建磁盘,我目前正在使用它,配置了 ~~ 20 个磁盘。

我对这些有一个新问题,我目前正在尝试为每个磁盘添加前缀,一个字符串。问题是当 php artisan config:cache 时路径正在被保存正在运行,但我需要在运行时更改它们,例如,对于用户 Sergio它需要附加 Sergio/例如到以下磁盘:

//filesystems.php
'random' => [
   'driver' => 'local',
   'root' => storage_path('app/random'),
],

然后
Storage::disk("random")->getDriver()->getAdapter()->getPathPrefix();
//outputs /var/www/html/project/storage/app/random

目标是在例如中间件中设置配置,我目前已经像这样设置了帐篷数据库
//Middleware
Config::set('database.connections.tenant.database', "Sergio");
DB::reconnect('tenant');

我目前可以正确设置路径
Config::set('filesystems.disks.random.root',storage_path('app/Sergio/random'));

但我很担心,因为如果在该行之前我尝试到达路径,则存储会将初始路径保存在内存中,而不是在更改后重新获取它。

例如。在没有任何中间件的情况下执行此操作。
$fullPath1 = Storage::disk("random")->getDriver()->getAdapter()->getPathPrefix();

Config::set('filesystems.disks.random.root',storage_path('app/Sergio/random'));

$fullPath2 = Storage::disk("random")->getDriver()->getAdapter()->getPathPrefix();

打算发生的是$fullPath1将输出初始路径,即 /var/www/html/project/storage/app/random然后 $fullPath2将输出 /var/www/html/project/storage/app/Sergio/random
有没有办法让存储知道我已经更改了磁盘本地路径?

最佳答案

添加一个新配置而不是更新已经加载的配置如何,如下所示:

private function addNewDisk(string $diskName) 
{
      config(['filesystems.disk.' . $diskName => [
          'driver' => 'local',
          'root' => storage_path('app/' . $diskName),
      ]]);
}

并且在使用 Storage 门面之前,调用上面的方法来更新配置,当您使用新磁盘时,它将尝试根据更新的配置再次解析。
{
....
    $this->addNewDisk('new_random');
    Storage::disk('new_random')->get('abc.txt'); // or any another method
...

}

关于Laravel 在运行时更改文件系统磁盘路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49417732/

相关文章:

php - Laravel:外观和别名之间的区别

laravel - 从 public/storage 到 storage/app/public 的符号链接(symbolic link)仍然使存储目录中的文件可以从网络访问

php - 使用 like 和通配符过滤集合

php - 将所有请求重定向到 index.html 除了请求到/api 文件夹

laravel - 使用Spout读取Excel文件时获取字段数据

mysql - Laravel 5 - 找不到 MySQL 存储过程

Laravel 5:Auth::user() 每次使用时都会查询数据库吗?

deployment - Laravel 7 fatal error : Uncaught RuntimeException: A facade root has not been set

laravel - 如何在 Laravel 中将 S3 存储桶中的文件作为图像返回?

php - Laravel 获取存储在公共(public)文件夹中的文件的公共(public) URL