【问题标题】:how can i pass a variable between functions in the same controller (laravel)?如何在同一控制器(laravel)中的函数之间传递变量?
【发布时间】:2021-11-18 09:03:47
【问题描述】:

我需要将$newOrder 传递给视图(orders.success),以便能够在订单完成后打印“收据”。似乎没有任何效果,我尝试过使用 compact/with 方法,但它始终未定义,因为 $newOrder 在另一个函数中声明。 你有什么建议吗?

    class BraintreeController extends Controller
{

    public function token(Request $request)
    {

        $gateway = new \Braintree\Gateway([
            'environment' => 'sandbox',
            'merchantId' => 'jgvy755pfvwdcjzx',
            'publicKey' => 'qqpm93srfgwtx6dp',
            'privateKey' => 'd13ce21a7642606db73b12bb1300d3fd'
        ]);

        $clientToken = $gateway->clientToken()->generate();

        if ($request->input('nonce') != null) {
            $request->validate([
                'name' => 'required',
                'last_name' => 'required',
                'phone' => 'required',
                'address' => 'required',
                'email' => 'email:rfc',
            ]);

            //# Storo l'ordine
            $name = $request->input('name');
            $last_name = $request->input('last_name');
            $address = $request->input('address');
            $phone = $request->input('phone');
            $email = $request->input('email');
            $arr_id = $request->input('arr_id');
            $arr_quant = $request->input('arr_quant');
            $delivery_fee = $request->input('delivery_fee');
            //# Recupero tutti i piatti dell'ordine per calcolarne il totale
            $dishes = Dish::findMany($arr_id);
            $arrayLength = count($arr_id);
            $amount = 0;
            for ($i = 0; $i < $arrayLength; $i++) {
                $amount +=  $dishes[$i]->price * $arr_quant[$i];
            }
            $amount += $delivery_fee;

            //#


            $newOrder = new Order();
            $newOrder->status = 1;
            $newOrder->address = $address;
            $newOrder->user_name = $name;
            $newOrder->user_surname = $last_name;
            $newOrder->phone = $phone;
            $newOrder->email = $email;
            $newOrder->total = $amount;
            $newOrder->save();

            // // storo l'array di IDs


            // Ciclo una volta per ogni piatto contenuto nell'ordine, salvo la relazione e la sua quantità
            for ($i = 0; $i < $arrayLength; $i++) {
                $dish_id = $arr_id[$i];
                // Scrive nella tabella pivot dopo aver creato la relazione
                $newOrder->dishes()->attach([$dish_id => ['quantity' => $arr_quant[$i]]]);
                //
            }

            //#


            var_dump($request->input('nonce'));
            $nonceFromTheClient = $request->input('nonce');
            $gateway->transaction()->sale([
                'amount' => $amount,
                'paymentMethodNonce' => $nonceFromTheClient,
                'options' => [
                    'submitForSettlement' => True
                ]
            ]);


            Mail::to($email)->send(new PaymentConfirmationMail());
            return view('orders.success');
        }


        return view('orders.braintree', ['token' => $clientToken]);
    }

    public function success(Request $request)
    {
        return view('orders.success');
    }
}

这是我尝试打印收据的视图

<body>
<div class="container mt-5 mb-5 text-center">
    <h1>Pagamento avvenuto con successo</h1>
    <h2 class="mb-5">il tuo ordine è stato preso in carico</h2>
    <a href="{{route('restaurants.index')}}">Ritorna ai ristoranti</a>
    <h1>{{$newOrder->address}}</h1>
</div>

【问题讨论】:

  • 您是否要检索刚刚保存的新订单?如果是这样,您可以通过$getTheNewOrder = Order::where('status', '=', 1)-&gt;where('address', '=', $request-&gt;address)-&gt;where('user_name', '=', $request-&gt;name)-&gt;where('user_surname', '=', $request-&gt;last_name)-&gt;where('phone', '=', $request-&gt;phone)-&gt;where('email', '=', $request-&gt;email)-&gt;latest()-&gt;first(); 进行查询。在return view('orders.success'); 之前添加此内容,并确保使用return view('orders.success', compact('getTheNewOrder')); 编辑您的退货视图
  • 是的,目标是检索新订单。尝试了您的解决方案,但 $getTheNewOrder 仍然为空...
  • 您应该在token 函数中包含我提到的查询,以便它仍然保留$getTheNewOrder 查询中使用的$request 值。

标签: php laravel


【解决方案1】:

试试这个

Mail::to($email)->send(new PaymentConfirmationMail());
return view('orders.success',['newOrder' => $newOrder]);

或者像这样更改成功函数的参数

public function success($newOrder)
{
    return view('orders.success', ['newOrder' => $newOrder]);
}

并从预览功能返回

Mail::to($email)->send(new PaymentConfirmationMail());
return $this->success($newOrder);

【讨论】:

  • 应用第一个解决方案 $newOrder 仍然未定义,而第二个解决方案给出错误“函数成功()的参数太少,传递了 0,预期正好 1”。无论如何,非常感谢你帮助我!
  • 您可以发布一个 repo 链接以在 Github 或 Gitlab 上查看您的项目吗?如果没有完整的代码,任何人都可以帮助您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2017-03-01
  • 2017-10-19
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 2020-10-12
相关资源
最近更新 更多