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 ParameterBag
is met een methode add
om parameters met waarden eraan toe te voegen.
Ik heb het volgende geprobeerd, maar ik krijg null
als 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 Job
te 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 request
gegevens 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
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
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.