[英]Catchable Fatal Error: Argument 1 passed to \Entity\Image::setFile() must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile,
[英]How can I solve “Type error: Argument 2 passed to … must be an instance of Symfony\Component\HttpFoundation\File\UploadedFile”?
我的控制器是這樣的:
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);
,有錯誤:
類型錯誤:傳遞給App \\ Services \\ ProductService :: createProduct()的參數2必須是Symfony \\ Component \\ HttpFoundation \\ File \\ UploadedFile的一個實例,給出數組
我怎么解決這個問題?
這里的問題是你要么獲得單個文件,要么獲得一組文件。 創建產品支持上傳多個文件嗎? 如果沒有,你可以這樣做:
// 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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.