it-swarm.com.de

Erstellen Sie ein Laravel Request-Objekt im Handumdrehen

Ich arbeite mit Daten in einem Controller und möchte sie weiter an einen anderen Controller übergeben, um doppelten Code zu vermeiden.

Gibt es eine Möglichkeit, ein Request-Objekt einzurichten, das in der store-Methode des anderen Controllers benötigt wird? Ich habe die Request-Vererbung verfolgt und bin zum Symfony-Request-Objekt gekommen, das über eine request-Eigenschaft verfügt, die in Wirklichkeit eine ParameterBag ist, die eine Methode add enthält, um Parameter mit Werten hinzuzufügen.

Ich habe folgendes versucht, erhalte jedoch null als Ergebnis:

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

Ich bin bei Laravel 5.1 für dieses Projekt.

16
Ben

Sie können replace() verwenden:

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

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

dd($request->foo);

Alternativ wäre es sinnvoller, eine Job für das, was sich in Ihrem zweiten Controller befindet, zu erstellen und die ShouldQueue-Schnittstelle zu entfernen, damit sie synchron läuft.

Hoffe das hilft!

28
Ross Wilson

Durch das Erstellen eines Anforderungsobjekts mit $myRequest = new Request(); wird das Objekt mit method = 'GET' erstellt. Sie können die Methode Ihrer Anforderung mit $myRequest->getMethod()..__ überprüfen. Da die request-Eigenschaft Daten für POST -Anforderungen enthält, können Sie $myRequest->request->add() standardmäßig nicht verwenden. Zuerst müssen Sie die Methode der Anforderung auf POST setzen:

$myRequest = new \Illuminate\Http\Request();
$myRequest->setMethod('POST');
$myRequest->request->add(['foo' => 'bar']);
dd($request->foo);

Übrigens können Sie mit $myRequest->query->add() Daten zu einer GET-Anfrage hinzufügen.

14
andras bujna

Um zu vermeiden, dass Sie doppelten Code haben, müssen Sie die allgemeine Funktionalität in eine dedizierte Klasse abstrahieren, ihr einen korrekten Mnemonennamen geben, eine Reihe von Komponententests schreiben und sie dann in Controllern verspotten, wenn Sie die Controller nicht testen.

aber wenn Sie noch Anfragen stellen müssen:

use Illuminate\Http\Request;

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

und wenn Sie die volle Funktionalität der Anfrage benötigen, müssen Sie einige zusätzliche Zeilen hinzufügen

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

Sie können den Anforderungsparameter mithilfe dieser Methoden spontan hinzufügen. 

Ersetzen

Funktion doc ersetzen

Wenn Sie sich im Controller befinden, übergeben Sie das Request-Objekt im Parameter der Funktion wie 

  function createUser(Illuminate\Http\Request $request){
     $request->replace(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}

Merge-Funktion

Zusammenführungsfunktion doc

function createUser(Illuminate\Http\Request $request){
     $request->merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"));
}

funktion hinzufügen

 function createUser(Illuminate\Http\Request $request){
     $request->request->add(array_merge(array("new_key1"=>"new_value1","new_key_n"=>"new_value_n"), $request->all()));
}

Anmerkung :: in allen Funktionen erweitern wir die Anfrage, dh der vorherige Parameter wird dort bleiben. Sie werden Ihre eigenen hinzufügen. Sie können sie alle ersetzen. 

0