Mit Laravel können Sie einem Anforderungsarray Werte hinzufügen

108

Ich stoße auf eine Situation in Laravel, während ich eine store () - oder update () -Methode mit dem Parameter Request aufrufe, um der Anfrage einen zusätzlichen Wert hinzuzufügen, bevor ich eloquente Funktionen aufrufe.

function store(Request $request) 
{
  // some additional logic or checking
  User::create($request->all());
}
Vijayanand Premnath
quelle
Welche Art von Behandlung möchten Sie machen? Möchten Sie dem $request->all()Array Schlüsselwerte hinzufügen ?
Hammerbot
Ja, ich muss einen Schlüsselwert hinzufügen
Vijayanand Premnath
Kannst du den array_add()Helfer nicht benutzen ? $array = array_add($request->all(), 'new_key', $value);: laravel.com/docs/5.2/helpers#method-array-add Wenn dies nicht die Art von Sache ist, nach der Sie suchen, können Sie weitere Informationen für Ihre Frage bereitstellen?
Hammerbot
$ Anfrage ist PHP-Objekt, wie ich verstehe, wenn Sie einige Funktionen neben dem Controller hinzufügen möchten, konvertieren Sie das Anfrage-Objekt in ein Array und fügen Sie hinzu, was immer Sie wollen
Chathura Hettiarachchi

Antworten:

198

Normalerweise möchten Sie einem Anforderungsobjekt nichts hinzufügen. Verwenden Sie besser Sammlung und put()Hilfsmittel:

function store(Request $request) 
{
    // some additional logic or checking
    User::create(array_merge($request->all(), ['index' => 'value']));
}

Oder Sie könnten Arrays vereinen :

User::create($request->all() + ['index' => 'value']);

Wenn Sie einem Anforderungsobjekt jedoch wirklich etwas hinzufügen möchten, gehen Sie folgendermaßen vor:

$request->request->add(['variable' => 'value']); //add request
Alexey Mezenin
quelle
3
Ja, es funktioniert jetzt für mich. Ich habe den Code als Funktionsspeicher geändert (Request $ request) {// zusätzliche Logik oder Überprüfung von $ plan = 123; // eine Logik zur Entscheidung des Benutzerplans $ request-> request-> add (['plan' => $ plan]); User :: create ($ request-> all ()); }
Vijayanand Premnath
1
Dies funktioniert nicht, da $ request-> all () ein Array und keine Sammlung ist.
kjdion84
1
Ich denke, es muss $ request-> request-> add sein (['variable' => 'value']);
Sergey Onishchenko
$ request-> request-> add ... Ich habe die Fehlermeldung 「Undefinierte Variable: request」 Aber ich hatte die 「Illuminate \ Http \ Request verwenden;」 warum habe ich die Fehlermeldung bekommen?
Robspin
Muss ich $ request = collect (); zuerst? Ist $ resquest eine Sammlung oder ein Array?
Robspin
56

Bezugnehmend auf die Alexey MezeninAntwort:

Während ich seine Antwort verwendete, musste ich etwas direkt zum Anforderungsobjekt hinzufügen und verwendete:

$request->request->add(['variable', 'value']);

Damit werden zwei Variablen hinzugefügt:

$request[0] = 'variable', $request[1] = 'value'

Wenn Sie ein Neuling wie ich sind und ein assoziiertes Array benötigen, ist dies der richtige Weg

$request->request->add(['variable' => 'value']);

Hoffe ich habe dir etwas Zeit gespart

PS: Danke @Alexey, du hast mir mit deiner Antwort wirklich geholfen

Mushood Badulla
quelle
$ request-> request-> add ... Ich habe die Fehlermeldung 「Undefinierte Variable: request」 Aber ich hatte die 「Illuminate \ Http \ Request verwenden;」 warum habe ich die Fehlermeldung bekommen?
Robspin
@robspin Ich denke, es ist ziemlich spät, aber Sie haben die Anfrage wahrscheinlich nicht in die Funktion
eingefügt. ZB
1
Für diejenigen unter Ihnen, die suchen, warum Ihr Wert nicht in die Datenbank Modelprotected $fillable = ['slug'];
eingefügt wird,
36

Ich habe die $request->merge($array)Funktion in Laravel 5.2 ausprobiert und sie funktioniert einwandfrei.

Beispiel:

$request->merge(["key"=>"value"]);
Ferhat KOÇER
quelle
2
Dies ist die perfekte Lösung
JHOAN B. HENRICHE
16

In Laravel 5.6 können wir beispielsweise Parameter zwischen Middlewares übergeben:

FirstMiddleware

public function handle($request, Closure $next, ...$params)
{
    //some code
    return $next($request->merge(['key' => 'value']));
}

SecondMiddleware

public function handle($request, Closure $next, ...$params)
{
    //some code
    dd($request->all());
}
Wiicho Orozco
quelle
1
Diese $request->merge()Methode FTW! Vielen Dank.
Martin Joiner
16

genug gesagt zu diesem Thema, aber ich konnte nicht widerstehen, meine eigene Antwort hinzuzufügen. Ich glaube, der einfachste Ansatz ist

request()->merge([ 'foo' => 'bar' ]);
f_i
quelle
14

Sie können auch den folgenden Code verwenden

$request->request->set(key, value).

Passt besser zu mir.

cosminpanait
quelle
Zumindest mit Laravel 5.6 geht das so! Tolle Antwort
Rockin4Life33
4

So fügen Sie newParamdem aktuellen RequestObjekt einen neuen Parameter hinzu, z. B .:

$newParam = "paramvalue";
$request->request->add(['newParam' => $newParam]);

Nach dem Hinzufügen des neuen Parameters können Sie diesen neu hinzugefügten Parameter zum Anforderungsobjekt anzeigen, indem Sie:

dd($request);//prints the contents of the Request object
Rahul Gupta
quelle
2

Ich habe diesen Code verwendet, um meiner Anfrage etwas hinzuzufügen.

$req->query->add(['key'=>'variable']);
$req->request->add(['key'=>'variable']);
Reza Azami
quelle
2

Sie können direkt mit auf das Anforderungsarray zugreifen $request['key'] = 'value'.

Kreshnik
quelle
2

Basierend auf meinen Beobachtungen :

$request->request->add(['variable' => 'value']);funktioniert (meistens) in POST-, PUT- und DELETE- Methoden, da Werte übergeben werden, einer davon ist _token. Wie Beispiel unten.

<form action="{{ route('process', $id) }}" method="POST">
    @csrf
</form>

public function process(Request $request, $id){
    $request->request->add(['id' => $id]);
}

Aber [unter Code] funktioniert nicht, da keine Werte übergeben wurden, es wird nicht wirklich hinzugefügt.

<a href='{{ route('process', $id) }}'>PROCESS</a>

public function process(Request $request, $id){
    $request->request->add(['id' => $id]);
}


Bei Verwendung der GET- Methode können Sie entweder Request deklarieren und direkt Werte zuweisen. Wie unten:

public function process($id){
    $request = new Request(['id' => $id]);
}

Oder Sie können verwenden merge. Dies ist tatsächlich besser, als $request->request->add(['variable' => 'value']);weil Anforderungswerte initialisiert und hinzugefügt werden können, die für alle Methoden funktionieren ( GET , POST , PUT , DELETE ).

public function process(Request $request, $id){
    $request->merge(['id' => $id]);
}

Tag: laravel5.8.11

Gecko
quelle
2

Das beste, das ich verwendet und recherchiert habe, ist $ request-> merge ([]) (Check My Piece of Code):

    public function index(Request $request) {
        not_permissions_redirect(have_premission(2));
        $filters = (!empty($request->all())) ? true : false;
        $request->merge(['type' => 'admin']);
        $users = $this->service->getAllUsers($request->all());
        $roles = $this->roles->getAllAdminRoles();
        return view('users.list', compact(['users', 'roles', 'filters']));
    }

Überprüfen Sie Zeile 3 in der Indexfunktion.

Abdulrehman Sheikh
quelle
0

Sie können der Anforderung von einer Middleware aus folgende Parameter hinzufügen:

public function handle($request, Closure $next)
{
    $request->route()->setParameter('foo', 'bar');
    return $next($request);
}
Agu Dondo
quelle
-2
$request->offsetSet(key, value);
ahcyT
quelle