php - Laravel 控制器 DI
问题描述
我有一个控制器和 FileUploader::class。Uploader 注入控制器的 __construct 方法。当我在代码中使用这个注入的实例时(见下文),我每次都得到相同的 obj。当我在不使用注入属性的情况下重构了类(参见代码的第二部分)时——它可以工作。但我想在整个项目中遵循相同的风格。
当它是一个文件上传时,它工作正常,但对于多个文件上传解决方案,有一个循环,它不起作用。
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
]);
}
}
文件上传::类
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)
推荐阅读
- python - Python 类型提示,输出类型取决于输入类型
- hive - 如何在 AWS Athena 中按列名而不是按列顺序从多个 CSV 创建表
- javascript - 这个函数声明是什么意思?函数名和参数相同
- python - 捕获溢出错误
- asp.net - VB.NET WEB API 2 中的多种 GET 方法
- unreal-engine4 - 灌木在某些侧面变黑
- vba - 处理大型 VBA 集合数据 - 过程太大错误
- maven - 在黄瓜 Junit 运行中出现初始化错误
- python - 有没有办法制作一个关于计算列表中不同元素的不同变量出现的列表?
- java - (Java) 在 if 语句中比较两个变量的值但不能使用 `.equals()`