سلام و عرض ادب
در رابطه با باگی که اخر این جلسه بود من از روش زیر رفتم، نمیدونم بهترین روش هست ولی خب جواب داد.
اول اینکه وقتی که یه تصویری رو آپدیت میکنیم در اصل فایل جدیدی رو آپلود میکنیم و فکر نمیکنم دیگه نیازی به فایل قبلی همین product داشته باشیم.هم دایرکتوریمون شلوغ میشه، هم حجم برنامه مون بدون دلیل موجهی بالا میره. پس بهتره که وقتی یه فایل جدید آپلود میشه، اول فایل قدیمی پاک بشه، بعد فایل جدید ذخیره بشه.
اول یه utility جدید ساختم:
class FileRemover
{
public static function remove($filePath, $diskType = 'public_storage')
{
return Storage::disk($diskType)->delete($filePath);
}
public static function removeMany($filesPath, $diskType = 'public_storage')
{
foreach ($filesPath as $filePath){
Storage::disk($diskType)->delete($filePath);
}
}
}
بعد تو کنترلر product یه متد جدید اضاف کردم:
private function removeOldImages($product, $validatedData)
{
if (isset($validatedData['source_url'])) {
$sourcePath = $product->source_url;
FileRemover::remove($sourcePath, 'local_storage');
}
if (isset($validatedData['thumbnail_url'])) {
$thumbnailPath = $product->thumbnail_url;
FileRemover::remove($thumbnailPath);
}
if (isset($validatedData['demo_url'])) {
$demoPath = $product->demo_url;
FileRemover::remove($demoPath);
}
}
بعدش هم داخل متد update فایلهای قدیمی رو با این خط حذف میکنیم:
$this->removeOldImages($product, $validatedData);
در نهایت متد upate به این صورت میشه:
public function update(UpdateRequest $request, $product_id)
{
$validatedData = $request->validated();
$product = Product::findOrFail($product_id);
$updatedProduct = $product->update([
'title' => $validatedData['title'],
'description' => $validatedData['description'],
'price' => $validatedData['price'],
'category_id' => $validatedData['category_id'],
]);
$this->removeOldImages($product, $validatedData);
$uploadedImages = $this->uploadImages($product, $validatedData);
if (!$uploadedImages || !$updatedProduct) {
return back()->with('failed', 'خطا در بروزرسانی محصول');
}
return back()->with('success', 'محصول بروزرسانی شد.');
}
امیدوارم مفید واقع بشه.