روز برنامه‌نویس مبارک 🤩🎉 از هدایای روز برنامه‌نویس جا نمونی ⌛
۰ ثانیه
۰ دقیقه
۰ ساعت
۶ دانشجوی سون‌لرن
مشکل در ایجاد محصول در صورت بروز خطا در اپلود فایل‌ها
جامعه پی اچ پی ایجاد شده در ۰۳ مرداد ۱۴۰۱

سلام

الان اگه من دفعه اول که دارم محصول رو ایجاد میکنم اپلود فایل‌ها ارور بخوره، باز محصول بدون اطلاعات فایل‌ها اپلود میشه. توی همچین مواردی که داره تو ۲ بخش انجام میشه بهتر نیست از transaction استفاده کنیم که بتونیم رول بک کنیم؟ این موارد چطور هندل میشه معمولا ؟

public function store(CreateProductRequest $request)
{
    DB::beginTransaction();
    $admin = User::query()->where('role', 'admin')->first();
    $createdProduct = Product::create([
        'title'=>$request->title,
        'description'=>$request->description,
        'price'=>$request->price,
        'category_id'=>$request->category_id,
        'user_id'=>$admin->id,
    ]);
    $result = self::uploadFiles($createdProduct, $request );
    if($result == 'failed'){
        DB::rollBack();
        return back()->with('failed','در آپلود فایل‌ها مشکلی پیش آمده است. لطفا دوباره تلاش کنید.');
    }
    elseif ($result== 'success'){
        DB::commit();
        return back()->with('success','ایجاد محصول موفقیت آمیز بود..');
    }
}

سلام دوست عزیز

فکر میکنید در چه شرایطی ممکنه اینجوری که شما میگید بشه که نیاز به transaction باشه؟

چون عموما اگر شما ولیدیشن‌ها رو درست انجام داده باشید و در کانفیگ وب سرور نیز مشکلی وجود نداشته باشه در اینجا نیازی بهش ندارید

محمد گازری ۰۳ مرداد ۱۴۰۱، ۱۳:۲۰

الان این اسکرین شات مربوط به کلاسه.

۱- میاد ولیدیشن‌های ریکویست رو چک میکنه و همه چی اوکی هست

۲- تو create میاد اون فیلدها رو ایجاد میکنه بدون در نظر گرفتن فایل‌ها

۳- الان میره سراغ اپلود فایل‌ها و اگه به مشکلی بخوره و مثلا بره تو catch الان اون create چه اتفاقی براش می‌افته ؟

840a-Screenshot from 2022-07-25 17-59-12.pngیا دارم یه جایی اشتباه میکنم ؟

صبا ح ۰۳ مرداد ۱۴۰۱، ۱۳:۳۴

به من خطای مناسب میده که تو اپلود فایل‌ها مشکلی ایجاد شده ولی وقتی میرم تو تیبل پروداکت اون اطلاعات اولیه اینزرت شدن .

صبا ح ۰۳ مرداد ۱۴۰۱، ۱۳:۳۵

خب این موضوع طبیعیه و دلیلش اینه که در ابتدا دیتا ایحاد میشه و در آهر فایل آپلود

در مورد اشتباه کدتون هم اگر شما دیتا رو در فرم ریکوئست ولیدیت کردید در قسمت زیر به این شکل دیتا رو پاس بدین

$result = self::uploadFiles($createdProduct, $request->all() ); // $request->all()
محمد گازری ۰۳ مرداد ۱۴۰۱، ۱۳:۵۲

فقط یه سوال دیگه :

وقتی از فایل ریکویست برای ولیدیشن دارم استفاده میکنم چرا باید

$request = $request->validated();

تو کد باشه؟ چون بدون این هم داره ولیدیشن رو انجام میده .

صبا ح ۰۳ مرداد ۱۴۰۱، ۱۴:۰۶

اگر از فرم ریکوست استفاده می‌کنید دیگه نیازی نیست

محمد گازری ۰۳ مرداد ۱۴۰۱، ۱۴:۱۷