Laravel ¿hay una forma de agregar valores a una matriz de solicitud?

109

Me encuentro con una situación en Laravel mientras llamo a un método store () o update () con el parámetro Request para agregar algún valor adicional a la solicitud antes de llamar a las funciones Eloquent, ¿hay alguna forma de hacerlo?

function store(Request $request) 
{
  // some additional logic or checking
  User::create($request->all());
}
Vijayanand Premnath
fuente
¿Qué tipo de tratamiento quieres hacer? ¿Quieres agregar valores clave a la $request->all()matriz?
Hammerbot
Sí, necesito agregar un valor clave
Vijayanand Premnath
¿No puedes usar el array_add()ayudante? $array = array_add($request->all(), 'new_key', $value);: laravel.com/docs/5.2/helpers#method-array-add Si este no es el tipo de cosa que está buscando, ¿podría proporcionar más información para su pregunta?
Hammerbot
$ request es un objeto php, según tengo entendido, si desea agregar algunas funciones en el lado del controlador, convierta el objeto de solicitud en una matriz y luego agregue lo que quiera
Chathura Hettiarachchi

Respuestas:

199

Por lo general, no desea agregar nada a un objeto Request, es mejor usar la colección y el put()ayudante:

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

O podría unir matrices :

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

Pero, si realmente desea agregar algo a un objeto Request, haga esto:

$request->request->add(['variable' => 'value']); //add request
Alexey Mezenin
fuente
3
Sí, me está funcionando ahora. He cambiado el código como función de almacenamiento (Solicitar $ solicitud) {// alguna lógica adicional o verificar $ plan = 123; // algo de lógica para decidir el plan del usuario $ request-> request-> add (['plan' => $ plan]); Usuario :: crear ($ solicitud-> todo ()); }
Vijayanand Premnath
1
Esto no funciona porque $ request-> all () es una matriz, no una colección.
kjdion84
1
Supongo que debe ser $ solicitud-> solicitud-> agregar (['variable' => 'valor']);
Sergey Onishchenko
$ request-> request-> add ... Recibí el mensaje de error 「Variable indefinida: solicitud」 Pero tuve el 「use Illuminate \ Http \ Request;」 ¿por qué recibí el mensaje de error?
robspin
¿Necesito $ request = collect (); ¿primero? ¿$ Resquest es una colección o matriz?
robspin
56

Refiriéndose a Alexey Mezeninresponder:

Mientras usaba su respuesta, tuve que agregar algo directamente al objeto de solicitud y usé:

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

Usando esto, agrega dos variables:

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

Si eres un novato como yo y necesitas una matriz asociada, la forma correcta de hacerlo es

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

Espero haberte salvado algo de tiempo

PD: Gracias @Alexey, realmente me ayudaste con tu respuesta.

mushood badulla
fuente
$ request-> request-> add ... Recibí el mensaje de error 「Variable indefinida: solicitud」 Pero tuve el 「use Illuminate \ Http \ Request;」 ¿por qué recibí el mensaje de error?
robspin
@robspin Creo que es bastante tarde, pero probablemente no inyectó la solicitud en la función Por ejemplo: función (Solicitar $ solicitud)
mushood badulla
1
Para aquellos de ustedes que están buscando por qué su valor no se inserta en la base de datos, ya que no declaré ese valor de la base de datos en mi Modelclase como:protected $fillable = ['slug'];
fWd82
36

Probé $request->merge($array)función en laravel 5.2 y está trabajando perfectamente.

Ejemplo:

$request->merge(["key"=>"value"]);
Ferhat KOÇER
fuente
2
esta es la solución perfecta
JHOAN B. HENRICHE
16

En laravel 5.6 podemos pasar parámetros entre Middlewares por ejemplo:

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
fuente
1
¡Ese $request->merge()método FTW! Gracias.
Martin Joiner
16

He dicho suficiente sobre este tema, pero no pude resistirme a agregar mi propia respuesta. Creo que el enfoque más simple es

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

También puede utilizar el siguiente código

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

Me queda mejor.

cosminpanait
fuente
¡Al menos con Laravel 5.6 así es como se hace! Gran respuesta
Rockin4Life33
4

Para agregar un nuevo parámetro, por ejemplo: newParamal Requestobjeto actual , puede hacer:

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

Después de agregar el nuevo parámetro, podrá ver este parámetro recién agregado al objeto Solicitud de la siguiente manera:

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

Usé este código para agregar algo a mi solicitud.

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

Puede acceder directamente a la matriz de solicitudes con $request['key'] = 'value';

Kreshnik
fuente
2

Basado en mis observaciones :

$request->request->add(['variable' => 'value']);funcionará (principalmente) en los métodos POST, PUT & DELETE , porque hay valores pasados, uno de ellos es _token. Como ejemplo a continuación.

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

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

Pero [debajo del código] no funcionará porque no hay ningún valor (s) pasado, realmente no agrega.

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

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


Al utilizar el método GET , puede declarar Solicitud y asignar valores directamente. Como abajo:

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

O puede usar merge. En realidad, esto es mejor que $request->request->add(['variable' => 'value']);porque puede inicializar y agregar valores de solicitud que funcionarán para todos los métodos ( GET , POST , PUT , DELETE )

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

Etiqueta: laravel5.8.11

geco
fuente
2

El mejor que he usado e investigado es $ 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']));
    }

Verifique la línea # 3 dentro de la función de índice.

Abdulrehman Sheikh
fuente
0

Puede agregar parámetros a la solicitud desde un middleware haciendo:

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