无法将请求从控制器传递到另一个控制器的视图

Can't pass Request from controller to another controller's view

我正在尝试传递来自控制器的请求,但由于我不明白的原因,数据根本没有传递到视图,我得到 Undefined variable: request。我已经确认,在重定向到操作之前,请求中填充了所有附加变量,所以问题一定在那之后。

制造商控制器

public function decode(Manufacturer $manufacturer, Request $request) {

    $validated = $request->validate([
    "id" => ["required","min:5","max:30", "alpha_num"],
    "email" => ["email","required","max:255"]
    ]);

    $request->merge([
        "manufacturer" => $manufacturer
    ]);

    // Pass the Request to the Manufacturer model and return a modified version of it
    $request = $manufacturer->oneplus($request); 

    return redirect()->action([TransactionController::class, "index"])->with($request);
    }

abort(404);

}

厂商型号:

public function oneplus($request) {

  $id = $request->id;

  /* BUSINESS LOGIC THAT GENERATES $new FROM $id... */
  
  $request->merge([
    'new' => $new
  ]);
      
  return $request;
}

路线在web.php

Route::get('/payment', [TransactionController::class, "index"]);

事务控制器:

public function index()
{
    return view('payment');
}

payment.blade.php

{{ dd($request->new) }}

您需要对 TransactionController 和 ManufacturerController 进行少量更改才能使其正常工作

事务控制器:

public function index(Request $request)
{
    return view('payment', [
        'request' => $request->session()->get('request')
     ]);
}

制造商控制器:

public function decode(Manufacturer $manufacturer, Request $request) {

    $validated = $request->validate([
    "id" => ["required","min:5","max:30", "alpha_num"],
    "email" => ["email","required","max:255"]
    ]);

    $request->merge([
        "manufacturer" => $manufacturer
    ]);

    // Pass the Request to the Manufacturer model and return a modified version of it
    $request = $manufacturer->oneplus($request); 

    return redirect()->action([TransactionController::class, "index"])->with('request', $request->all());
    }

abort(404);

}

你可以这样通过
制造商控制器:

return redirect()->action(
    [TransactionController::class, "index"],
    ['data' => $request]
);

路线在web.php

// ? = Optional
Route::get('/payment/{data?}', [TransactionController::class, "index"]);

事务控制器:

public function index($data)
{
    return view('payment');
}

使用重定向时的问题是重定向会导致发生全新的请求。使用 redirect()->with('variable', 'value') 时,您需要使用以下方法访问该变量:

session('variable')` 

原因是变量通过会话“闪现”到下一个请求(实际上它不会发送到下一个请求,它只是可用于通过会话的下一个请求然后消失)。

虽然这可能是您问题的简单解决方案,但更好的解决方案是尽可能不使用重定向。这是替代方案的简化:

制造商控制器:

public function decode(Manufacturer $manufacturer, Request $request) {

    $validated = $request->validate([
    "id" => ["required","min:5","max:30", "alpha_num"],
    "email" => ["email","required","max:255"]
    ]);

    $request->merge([
        "manufacturer" => $manufacturer
    ]);

    // Pass the Request to the Manufacturer model and return a modified version of it
    $request = $manufacturer->oneplus($request); 
    $transactionController = app()->make(TransactionController::class);
    return $transactionController->index($request);
}

事务控制器:

public function index(Request $request)
{
    return view('payment')->with("request", $request);
}

这将在同一个请求中调用另一个控制器方法。