Laravel umożliwia dodawanie wartości do tablicy żądań

114

Natknąłem się na sytuację w Laravel podczas wywoływania metody store () lub update () z parametrem Request w celu dodania dodatkowej wartości do żądania przed wywołaniem funkcji Eloquent, czy jest na to jakikolwiek sposób.

function store(Request $request) 
{
  // some additional logic or checking
  User::create($request->all());
}
Vijayanand Premnath
źródło
Jaki rodzaj leczenia chcesz wykonać? Czy chcesz dodać wartości kluczy do $request->all()tablicy?
Hammerbot
Tak, muszę dodać wartość klucza
Vijayanand Premnath
Nie możesz użyć array_add()pomocnika? $array = array_add($request->all(), 'new_key', $value);: laravel.com/docs/5.2/helpers#method-array-add Jeśli tego nie szukasz, czy możesz podać więcej informacji na swoje pytanie?
Hammerbot
$ request to obiekt php, jak rozumiem, jeśli chcesz dodać kilka funkcji po stronie kontrolera, przekonwertuj obiekt żądania na tablicę, a następnie dodaj, co chcesz
Chathura Hettiarachchi

Odpowiedzi:

208

Zazwyczaj nie chcesz niczego dodawać do obiektu Request, lepiej jest użyć kolekcji i put()pomocnika:

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

Lub możesz połączyć tablice :

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

Ale jeśli naprawdę chcesz dodać coś do obiektu Request, zrób to:

$request->request->add(['variable' => 'value']); //add request
Alexey Mezenin
źródło
3
Tak, teraz działa dla mnie. Zmieniłem kod jako magazyn funkcji (żądanie $ request) {// dodatkowa logika lub sprawdzanie $ plan = 123; // logika decydująca o planie użytkownika $ request-> request-> add (['plan' => $ plan]); User :: create ($ request-> all ()); }
Vijayanand Premnath
1
To nie działa, ponieważ $ request-> all () jest tablicą, a nie kolekcją.
kjdion84
1
Myślę, że to musi być $ request-> request-> add (['variable' => 'value']);
Sergey Onishchenko
$ request-> request-> add ... Otrzymałem komunikat o błędzie 「Niezdefiniowana zmienna: żądanie」 Ale musiałem 「użyć Illuminate \ Http \ Request; got dlaczego otrzymałem komunikat o błędzie?
robspin
Czy muszę $ request = collect (); pierwszy? Czy $ resquest jest kolekcją czy tablicą?
robspin
59

Odnosząc się do Alexey Mezeninodpowiedzi:

Korzystając z jego odpowiedzi musiałem coś dodać bezpośrednio do obiektu Request i użyłem:

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

Używając tego, dodaje dwie zmienne:

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

Jeśli jesteś nowicjuszem jak ja i potrzebowałeś tablicy skojarzonej, właściwym sposobem jest to

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

Mam nadzieję, że zaoszczędziłem ci trochę czasu

PS: Dziękuję @Alexey, naprawdę pomogłeś mi w udzieleniu odpowiedzi

mushood badulla
źródło
$ request-> request-> add ... Otrzymałem komunikat o błędzie 「Niezdefiniowana zmienna: żądanie」 Ale musiałem 「użyć Illuminate \ Http \ Request; got dlaczego otrzymałem komunikat o błędzie?
robspin
@robspin Myślę, że jest dość późno, ale prawdopodobnie nie wstawiłeś żądania w funkcji Np .: function (Request $ request)
mushood badulla
1
Dla tych z Was, którzy szukają powodów, dla których Wasza wartość nie jest wstawiana do bazy danych, ponieważ nie zadeklarowałem tej wartości bazy danych w mojej Modelklasie jako:protected $fillable = ['slug'];
fWd82
40

Próbowałem $request->merge($array)funkcji w Laravel 5.2 i działa idealnie.

Przykład:

$request->merge(["key"=>"value"]);
Ferhat KOÇER
źródło
2
to jest idealne rozwiązanie
JHOAN B. HENRICHE
17

wystarczająco dużo powiedziane na ten temat, ale nie mogłem się powstrzymać przed dodaniem własnej odpowiedzi. Uważam, że najprostsze podejście jest takie

request()->merge([ 'foo' => 'bar' ]);
f_i
źródło
16

W laravel 5.6 możemy przekazywać parametry między oprogramowaniem pośredniczącym, na przykład:

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
źródło
1
Ta $request->merge()metoda FTW! Dzięki.
Martin Joiner
15

Możesz również użyć poniższego kodu

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

Lepiej mi pasuje.

cosminpanait
źródło
Przynajmniej w przypadku Laravel 5.6 tak to się robi! Świetna odpowiedź
Rockin4Life33
4

Aby dodać nowy parametr np. newParamDo aktualnego Requestobiektu, możesz:

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

Po dodaniu nowego parametru możesz zobaczyć ten nowo dodany parametr do obiektu Request poprzez:

dd($request);//prints the contents of the Request object
Rahul Gupta
źródło
3

Na podstawie moich obserwacji :

$request->request->add(['variable' => 'value']);będzie (głównie) działać w metodach POST, PUT i DELETE , ponieważ są przekazywane wartości, jedna z nich jest _token. Jak przykład poniżej.

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

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

Ale [poniższy kod] nie zadziała, ponieważ nie ma przekazanych wartości, tak naprawdę nie dodaje.

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

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


Korzystając z metody GET , możesz zadeklarować żądanie i bezpośrednio przypisać do niego wartości. Jak poniżej:

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

Lub możesz użyć merge. W rzeczywistości jest to lepsze niż $request->request->add(['variable' => 'value']);ponieważ można zainicjować i dodać wartości żądań, które będą działać dla wszystkich metod ( GET , POST , PUT , DELETE )

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

Tag: laravel5.8.11

gekon
źródło
2

Użyłem tego kodu, aby dodać coś do mojej prośby.

$req->query->add(['key'=>'variable']);
$req->request->add(['key'=>'variable']);
Reza Azami
źródło
2

Możesz uzyskać bezpośredni dostęp do tablicy żądań za pomocą $request['key'] = 'value';

Kreshnik
źródło
2

Najlepszy, z którego korzystałem i badałem, to $request->merge([])(Sprawdź mój fragment kodu):

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']));
}

Sprawdź wiersz # 3 wewnątrz funkcji indeksu.

Abdulrehman Sheikh
źródło
0

Możesz dodać parametry do żądania z oprogramowania pośredniego, wykonując:

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