Php 拉威尔控制器
我有一个控制器和文件上传器::类。上传器注入到控制器的构造方法。当我在代码中使用这个注入实例时(见下文),我每次都得到相同的obj。 我在没有使用注入属性的情况下重构了类(见代码的第二部分)——它可以工作。但我想在整个项目中遵循相同的风格 当它是一个文件上传时,它工作得很好,但对于多个文件上传解决方案,使用循环,它不工作Php 拉威尔控制器,php,laravel,oop,dependency-injection,Php,Laravel,Oop,Dependency Injection,我有一个控制器和文件上传器::类。上传器注入到控制器的构造方法。当我在代码中使用这个注入实例时(见下文),我每次都得到相同的obj。 我在没有使用注入属性的情况下重构了类(见代码的第二部分)——它可以工作。但我想在整个项目中遵循相同的风格 当它是一个文件上传时,它工作得很好,但对于多个文件上传解决方案,使用循环,它不工作 class ProposalFileController extends Controller { public $fileUploader; public
class ProposalFileController extends Controller
{
public $fileUploader;
public function __construct(FileUploader $fileUploader)
{
$this->fileUploader = $fileUploader;
}
public function upload(ProposalFileUpload $request)
{
$files = [];
foreach ($request->file('files') as $file)
{
/** !!! Attention here !!!!!!!
In this loop, $this->fileUploader is same obj each time
**/
$files[] = $this->fileUploader->upload($file);
}
return response()
->json([
'data' => $files
]);
}
}
我每次都需要新的上传器实例。下面这堂课很管用,但我不喜欢它的风格。如何使用DI解决方案解决此问题
class ProposalFileController extends Controller
{
public $fileUploader;
public function __construct(FileUploader $fileUploader)
{
$this->fileUploader = $fileUploader;
}
public function upload(ProposalFileUpload $request)
{
$files = [];
foreach ($request->file('files') as $file)
{
$uploader = new FileUploader(new File());
$files[] = $uploader->upload($file);
}
return response()
->json([
'data' => $files
]);
}
}
FileUpload::类
class FileUploader implements Uploader
{
use UploadHelper;
private $file;
public function __construct(File $file)
{
$this->file = $file;
}
public function upload(UploadedFile $file)
{
$saveName = $this->fileName($file);
/** Save file to s3 */
$storagePath = Storage::disk('s3')->put(...);
/** Set cover_rel - relative path needed for delete file needs */
$this->file->setAttribute('file_rel', $storagePath);
$this->file->save();
return $this->file;
}
}
最后,我得到了n次具有相同文件的数组(与循环步骤相同)您可以使用
app
方法在循环中插入FileUploader实例,如下所示
$uploader=app(FileUploader::class)
中的FileUploader::class File::class也被注入到了_construct()方法中。这里的问题似乎在于您的FileUploader类,为什么必须为每个文件创建一个新实例。难道不可能重新构造这个类,这样就没有必要了吗?@Josh将添加一个FileUploadClass@Josh请看一看,它看起来不像。。。这与我的第二个变体几乎相同,只是更“以拉雷维尔的方式”。。。我想使用`$this->fileUploader->upload(…)`