我的控制器是这样的:
public function store(CreateProductRequest $request)
{
...
$result = $this->product_service->createProduct($param,$photo);
...
}
我的服务是这样的:
public function createProduct($param, UploadedFile $photo=null)
{
dd($photo);
if($photo) {
$fileName = str_random(40) . '.' . $photo->guessClientExtension();
$param['photo'] = $fileName;
$param['photo_list'] = json_encode(['id'=>1,'name'=>$fileName]);
}
...
if(is_array($result) && count($result)>1 && $result[0])
$this->savePhoto($photo, $fileName,$result[1]->id);
...
return $result;
}
private function savePhoto(UploadedFile $photo, $fileName, $id)
{
$destinationPath = public_path() . DIRECTORY_SEPARATOR . 'img'. DIRECTORY_SEPARATOR .'products'.DIRECTORY_SEPARATOR.$id;
$photo->move($destinationPath, $fileName);
resize_image($fileName,250,'products',$id);
return $fileName;
}
Symfony \ Component \ HttpFoundation \ File \ UploadedFile是这样的:https://pastebin.com/KLfnXZJV
当变量$photo
不是数组或只有1个数据时,我会dd($photo);
,它会显示结果
但是当变量$photo
是数组时,我会dd($photo);
,存在错误:
类型错误:参数2传递给 App \ Services \ ProductService :: createProduct()必须是。的实例 Symfony \ Component \ HttpFoundation \ File \ UploadedFile,给定数组
我该如何解决这个问题?
答案 0 :(得分:1)
这里的问题是您要么获得单个文件,要么获得文件数组。创建产品支持上传多个文件吗?如果没有,你可以这样做:
// If file is inside an array, pull it out
if (is_array($photo) && $photo[0] instanceof UploadedFile) {
$photo = $photo[0];
}
// Run upload
$result = $this->product_service->createProduct($param, $photo);
如果您需要上传多个文件的功能,则需要执行一些操作。首先,您无法将方法键入UploadedFile
。相反,请将其类型化为数组:
public function createProduct($param, array $photos = [])
然后在您的createProduct
逻辑中,您需要遍历照片数组并单独保存。
最后,在您的控制器中,您需要执行与第一个建议相反的操作,而不是从数组中提取,您需要将其放在一个:
if ($photo instanceof UploadedFile) {
$photo = [$photo];
}