通过对象在Laravel中使用存储外观

时间:2019-01-11 10:18:50

标签: php laravel ftp

我正在一个项目中,用户必须将几个图像(通过单个表单字段)上传到服务器。使用foreach,我使用ftp存储图像。这是我的代码:

use Storage;
$image_list = $request->file('images');
foreach($image_list as $image){
  $filename = Cuid::slug().'.'.$image->getClientOriginalExtension();
  $path = "images/templates/";
  Storage::disk('ftp')->put($path.$filename, 'Contents');
}

该代码实际上可以正常工作,但是我担心直接使用Storage Facade可以像这样为每个循环创建多个实例,并且它不再是优化的代码。我试图像这样为存储外观创建对象:

$storage = new Storage;
foreach($image_list as $image){
  ...
  $storage->disk('ftp')->put($path.$filename, 'Contents');
}

但这给了我一个错误:

  

调用未定义的方法Illuminate \ Support \ Facades \ Storage :: disk()

有没有办法在每次循环运行时不直接调用Storage Facade?

1 个答案:

答案 0 :(得分:2)

  

这段代码实际上可以正常工作,但是我担心直接使用Storage Facade这样会为每个循环创建多个实例,并且它不再是优化代码了。

根据我的理解,您担心所编写的代码没有得到优化,因为您直接使用了Facades。

Facades不一定每次使用Facade时都会创建新对象,而是从容器中解析出来(将其视为黑盒,它将满足您的要求),有时会创建一个新对象,但是通常,它仍然会为您提供已经存在的对象。

如果您想知道这是如何工作的,请执行以下操作:Google用于单例和备忘录。

因此,在这种情况下,您可以使用相同的代码而不必担心。和您尝试提出的代码仍然相同。但是,我敢肯定,您会遇到性能问题,但是现在不是。

我现在想到的一件事是修改您的代码,使您可以尝试一次保存/放置许多文件,而不是一次通过FTP发送一个文件?还是可以使用a queue