Maak direct een Laravel Request-object

Ik verwerk gegevens in de ene controller en wil deze verder doorgeven aan een andere controller om dubbele code te voorkomen.

Is er een manier om een ​​Request-object in te stellen dat nodig is in de store-methode van de andere controller? Ik heb de Request-overerving getraceerd en kwam bij Symfony’s Request-object dat een request-eigenschap heeft die in feite een ParameterBagis met een methode addom parameters met waarden eraan toe te voegen.

Ik heb het volgende geprobeerd, maar ik krijg nullals resultaat:

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

Ik gebruik Laravel 5.1 voor dit project.


Antwoord 1, autoriteit 100%

U kunt replace()gebruiken:

$request = new \Illuminate\Http\Request();
$request->replace(['foo' => 'bar']);
dd($request->foo);

Als alternatief zou het logischer zijn om een ​​Jobte maken voor wat er ook gebeurt in je tweede controller en de ShouldQueue-interface te verwijderen om deze synchroon te laten werken.

p>

Hopelijk helpt dit!


Antwoord 2, autoriteit 45%

Een aanvraagobject maken met $myRequest = new Request();maakt het object aan met method = 'GET'. U kunt de methode van uw verzoek controleren met $myRequest->getMethod().
Aangezien de eigenschap requestgegevens bevat voor POST-verzoeken, kunt u standaard $myRequest->request->add()niet gebruiken. Eerst moet je de methode van het verzoek instellen op POST:

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

Trouwens, met $myRequest->query->add()kun je gegevens toevoegen aan een GET-verzoek.


Antwoord 3, autoriteit 33%

Om “dubbele code te vermijden” moet je de algemene functionaliteit abstraheren in een speciale klasse, deze een juiste geheugensteun geven, er een reeks unittests omheen schrijven en deze vervolgens bespotten in controllers bij het testen van controllers.

>

maar als je nog steeds verzoeken moet doen:

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

en als je de volledige functionaliteit van het verzoek nodig hebt, moet je wat extra regels toevoegen

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

Antwoord 4, autoriteit 2%

U kunt het bestaande verzoek klonen en vullen met nieuwe gegevens:

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

Antwoord 5

Je kunt de verzoekparameter on-the-fly toevoegen met deze methoden.

Vervangen

functiedocument vervangen

Als je in de controller zit, geef dan Request object door in de parameter van de functie zoals

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

Samenvoegfunctie

functiedocument samenvoegen

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

functie toevoegen

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

Opmerking: in alle functies breiden we het verzoek uit, de vorige parameter blijft daar. U gaat uw eigen toevoegen. Je kunt ze allemaal vervangen.

Other episodes