۴ مجید صادقی زاده
مشکل در متد checkout در بخش payment
جامعه لاراول ایجاد شده در ۱۸ اسفند ۱۳۹۸

با عرض سلام 

در BasketController متد زیر مشکل دارد ، متغیر order مقدار null رو برمیگردونه
 

BasketController.php codes :
 private $basket;
    private $transaction;
    public function __construct(Basket $basket , Transaction $transaction)
    {
        $this->middleware('auth')->only(['checkoutForm','checkout']);
        $this->basket = $basket;
        $this->transaction = $transaction;
    }
public function checkout(Request $request)
    {
        $this->validateForm($request);
        $order =  $this->transaction->checkout();
        if(!is_null($order)){
            return redirect()->route('home')->with('success', __('payment.your order has been registered', ['orderNum' => $order->id]));
        }
        return 'Order is Empty';
    }
-----------------------------------------------------
Transaction.php codes :
 public function checkout()
    {
        DB::beginTransaction();
        try{
            $order = $this->makeOrder();
            $payment = $this->makePayment($order);
            DB::commit();
        }catch(\Exception $e){
            DB::rollBack();
            return null;
        }
        if ($payment->isOnline()) {
            $this->gatewayFactory()->pay($order);
        }
        $this->completeOrder($order);
        return $order;
    }
 private function makeOrder()
    {
        $order = Order::create([
            'user_id' => auth()->user()->id,
            'code' => bin2hex(str_random(16)),
            'amount' => $this->basket->subTotal()
        ]);
        $order->products()->attach($this->products());
        return $order;
    }
    private function makePayment($order)
    {
        return Payment::create([
            'order_id' => $order->id,
            'pay_method' => $this->request->pay_method,
            'amount' => $order->amount,
        ]);
    }
private function gatewayFactory()
    {
        $gateway = [
            'saman' => Saman::class,
            'pasargad' => Pasargad::class
        ][$this->request->gateway];
        return resolve($gateway);
    }
 private function completeOrder($order)
    {
        $this->normalizeQuantity($order); 
        event(new OrderRegistered($order));
        $this->basket->clear();
    }

 

استاد من بررسی کردم ، دقیقا خطایی که میده برای دستور زیر هست

$order =  $this->transaction->checkout();

که توی متد checkout در فایل BasketController وجود دارد ، که میرسه به متدهای makeOrder و makePayment ، متد اولی یعنی makeOrder درست کار میکنه اما متد دوم دقیقا برای اون موردی که توی یه پست دیگه خدمتتون گفته بودم بخاطر خالی بودن فیلد gateway خطا میده ، لطفا راهنمایی بفرمایید چطوری این فیلد رو در این بخش هندل کنم ، توی حالتی که کدهاش بالا موجود هست این فیلد وجود نداره

مجید صادقی زاده ۱۸ اسفند ۱۳۹۸، ۱۲:۴۶

به این شکل مقدار دهی کردم

private function makePayment($order)
{
    return Payment::create([
        'order_id' => $order->id,
        'pay_method' => $this->request->pay_method,
        'amount' => $order->amount,
        'gateway' => $this->request->gateway,
    ]);
}

 

مجید صادقی زاده ۱۸ اسفند ۱۳۹۸، ۱۲:۵۶

سلام ... 

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

مهرداد سامی ۲۱ اسفند ۱۳۹۸، ۰۷:۳۳

استاد من طبق آموزش پیش رفتم خطا داشتم ، یکی یکی بررسی کردم به اینجا رسیدم که این خط رو اضاف کنم 

توی ویدئوهای مربوط به پروژه‌های دیگه یه خط کد دیگه ای اضافه کردید که فرصت نکردم هنوز اونو بررسی کنم که این خطی که نوشتم رو بردارم برنامه درست کار میکنه با اون یا نه ، حتما بررسی کردم نتیجه رو میزارم

مجید صادقی زاده ۲۱ اسفند ۱۳۹۸، ۱۵:۳۶