[英]Create a Laravel Request object on the fly
我正在處理一個 controller 中的數據,並希望將其進一步傳遞到另一個 controller 以避免重復代碼。
有沒有辦法設置另一個控制器的store
方法中需要的 Request object ? 我追蹤了 Request inheritance 並來到 Symfony 的 Request object ,它有一個request
屬性,實際上是一個ParameterBag
,它包含一個方法add
來添加帶有值的參數。
我嘗試了以下方法,但結果是null
:
$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);
我正在為這個項目使用 Laravel 5.1。
您可以使用replace()
:
$request = new \Illuminate\Http\Request();
$request->replace(['foo' => 'bar']);
dd($request->foo);
或者,為第二個控制器中發生的任何事情創建一個Job
並刪除ShouldQueue
接口以使其同步運行會更有意義。
希望這有幫助!
使用$myRequest = new Request();
創建一個請求對象$myRequest = new Request();
使用method = 'GET'
創建對象。 您可以使用$myRequest->getMethod()
檢查請求的方法。 由於request
屬性保存 POST 請求的數據,因此默認情況下您不能使用$myRequest->request->add()
。 首先,您必須將請求的方法設置為 POST:
$myRequest = new \Illuminate\Http\Request();
$myRequest->setMethod('POST');
$myRequest->request->add(['foo' => 'bar']);
dd($request->foo);
順便說一下,使用$myRequest->query->add()
您可以向 GET 請求添加數據。
為了“避免重復代碼”,您需要將通用功能抽象到一個專用類中,給它一個合適的助記符名稱,圍繞它編寫一組單元測試,然后在對控制器進行單元測試時在控制器中模擬它。
但如果您仍然需要提出請求:
use Illuminate\Http\Request;
$request = new Request([
'name' => 'unit test',
'number' => 123,
]);
如果您需要請求的全部功能,則需要添加一些額外的行
$request
->setContainer(app())
->setRedirector(app(\Illuminate\Routing\Redirector::class))
->validateResolved();
您可以克隆現有請求並用新數據填充它:
$request = (clone request())->replace(['foo' => 'bar']);
您可以使用這些方法動態添加請求參數。
如果您在控制器中,則在函數的參數中傳遞請求對象,例如
function createUser(Illuminate\Http\Request $request){
$request->replace(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}
function createUser(Illuminate\Http\Request $request){
$request->merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"));
}
function createUser(Illuminate\Http\Request $request){
$request->request->add(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}
注意:在我們擴展請求的所有函數中,意味着先前的參數將保留在那里。 您將添加自己的。 你可以全部替換它們。
你必須改變
這個
$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);
至
$myRequest = new Request();
$myRequest->merge(['foo' => 'bar']);
echo $myRequest->input('foo');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.