簡體   English   中英

即時創建 Laravel 請求 object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM