So ändern Sie den Wert eines Anforderungsparameters in Laravel

89

Ich muss den Wert meines Anforderungsparameters wie folgt ändern:

$request->name = "My Value!";

Ich benutze diesen Code, funktioniert aber nicht:

$request->offsetSet('img', $img);
Morteza Negahi
quelle
1
Mögliches Duplikat des Laravel-Änderungs-Eingabewerts - die Antwort finden Sie im Kommentar zur obersten Frage.
Joel Hinz

Antworten:

45

Verwendung merge():

$request->merge([
    'user_id' => $modified_user_id_here,
]);

Einfach! Es ist nicht erforderlich, das Ganze $request->all()in eine andere Variable zu übertragen.

Doncadavona
quelle
184

Versuchen zu:

$requestData = $request->all();
$requestData['img'] = $img;

Ein anderer Weg, es zu tun:

$request->merge(['img' => $img]);

Danke an @JoelHinz dafür.

Wenn Sie verschachtelte Daten hinzufügen oder überschreiben möchten:

$data['some']['thing'] = 'value';
$request->merge($data);

Wenn Sie kein Request $requestObjekt injizieren , können Sie stattdessen den globalen request()Helfer oder die \Request::Fassade verwenden$request

Alexey Mezenin
quelle
Fehler: Aufruf der undefinierten Methode Illuminate \ Http \ Request :: put ()
Morteza Negahi
put () ist eine Erfassungsmethode, $ request-> all () gibt ein Array zurück.
Joel Hinz
3
Das Anforderungsobjekt verfügt tatsächlich über die Methoden replace () und merge (). Im Allgemeinen bevorzuge ich diese. In meinem Kommentar zur Frage finden Sie eine SO-Antwort dazu.
Joel Hinz
@JoelHinz, ich dachte, dass sie in Laravel 5 nicht funktionieren, weil ich nur wenige Posts gesehen habe, in denen Jungs Probleme mit der Verwendung dieser Methoden hatten. Aber ich habe mir den RequestQuellcode von L5 angesehen und kann diese Methoden sehen. Vielen Dank.
Alexey Mezenin
4
Kein Schweiß. Ihre Antwort ist jedoch immer noch falsch. Die Methode replace () ersetzt die gesamte Eingabe. Sie müssen merge () verwenden, wenn Sie nur einen Wert ersetzen möchten.
Joel Hinz
7

Wenn Sie die Anfrage anpassen müssen

$data = $request->all();

Sie können den Namen des Feldes und den Wert übergeben

$data['product_ref_code'] = 1650;

und schließlich die neue Anfrage weitergeben

$last = Product::create($data);
Alaa Moneam
quelle
2

Wenn Sie benutzerdefinierte Anforderungen zur Validierung, zum Ersetzen von Daten zur Validierung oder zum Festlegen von Standarddaten (für Kontrollkästchen oder andere) verwenden, verwenden Sie die Überschreibungsmethode prepareForValidation().

namespace App\Http\Requests\Admin\Category;

class CategoryRequest extends AbstractRequest
{
    protected function prepareForValidation()
    {
        if ( ! $this->get('url')) {
            $this->merge([
                'url' => $this->get('name'),
            ]);
        }
        $this->merge([
            'url'    => Str::slug($this->get('url')),
            'active' => (int)$this->get('active'),
        ]);
    }
}

Ich hoffe, diese Informationen werden jemandem nützlich sein.

Oleg
quelle
1

Es funktioniert für mich

$request = new Request();
$request->headers->set('content-type', 'application/json');     
$request->initialize(['yourParam' => 2]);

Ausgabe überprüfen

$queryParams = $request->query();
dd($queryParams['yourParam']); // 2
Phuc
quelle
1

Tolle Antworten hier, aber ich musste einen Wert in einer JSON-Anfrage ersetzen. Nachdem ich mich ein wenig mit dem Code befasst hatte, kam ich auf den folgenden Code. Lass es mich wissen, wenn ich etwas Dummes mache.

$json = $request->json()->all();
$json['field'] = 'new value';
$request->json()->replace($json);
Phönix
quelle
1

Wenn Sie eine Eigenschaft in der Anforderung aktualisieren müssen, empfehle ich Ihnen, die von Laravel verwendete Ersetzungsmethode aus der Anforderungsklasse zu verwenden

$request->replace(['property to update' => $newValue]);
Ja Ouad
quelle