web-dev-qa-db-ja.com

Laravel要求オブジェクトをその場で作成する

あるコントローラーでデータを処理していますが、コードを重複させないために、さらに別のコントローラーに渡したいと思います。

他のコントローラーのstore- methodで必要なRequestオブジェクトをセットアップする方法はありますか? Requestの継承をたどり、実際にrequestであるParameterBagプロパティを持つSymfonyのRequestオブジェクトに到達しました。このプロパティは、値を持つパラメーターを追加するaddを保持します。

私は次のことを試しましたが、結果としてnullを得ています:

$myRequest = new Request();
$myRequest->request->add(['foo' => 'bar']);
var_dump($myRequest->foo);

私はLaravel 5.1このプロジェクトで。

31
Ben

replace()を使用できます:

$request = new \Illuminate\Http\Request();

$request->replace(['foo' => 'bar']);

dd($request->foo);

または、2番目のコントローラーで行われていることに対してJobを作成し、ShouldQueueインターフェイスを削除して同期的に実行する方が合理的です。

お役に立てれば!

45
Rwd

$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リクエストにデータを追加できます。

22
andras bujna

「コードの重複を避ける」ためには、共通の機能を専用のクラスに抽象化し、適切なニーモニック名を付け、ユニットテストのセットを記述し、コントローラーをユニットテストするときにコントローラーでモックする必要があります。

それでもリクエストを行う必要がある場合:

use Illuminate\Http\Request;

$request = new Request([
        'name'   => 'unit test',
        'number'  => 123,
    ]);

リクエストのすべての機能が必要な場合は、いくつかの行を追加する必要があります

$request
            ->setContainer(app())
            ->setRedirector(app(\Illuminate\Routing\Redirector::class))
            ->validateResolved();
5

これらのメソッドを使用して、リクエストパラメータをその場で追加できます。

交換

関数ドキュメントの置き換え

あなたがコントローラにいる場合、次のような関数のパラメータでリクエストオブジェクトを渡します

  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()));
}

注::すべての機能で、リクエストを拡張しています。つまり、以前のパラメーターがそこに残ることを意味します。独自のものを追加します。それらをすべて置き換えることができます。

0