Как изменить значение параметра запроса в laravel

94

Мне нужно изменить значение моего параметра запроса следующим образом:

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

Я использую этот код, но не работает:

$request->offsetSet('img', $img);
Мортеза Негахи
источник
1
Возможный дубликат входного значения изменения Laravel - ответ находится в комментарии к главному вопросу.
Joel Hinz

Ответы:

62

Использование merge():

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

Просто! Нет необходимости переносить все $request->all()в другую переменную.

Doncadavona
источник
187

Пытаться:

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

Другой способ сделать это:

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

Спасибо @JoelHinz за это.

Если вы хотите добавить или перезаписать вложенные данные:

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

Если вы не внедряете Request $requestобъект, вы можете использовать глобальный request()помощник или \Request::фасад вместо$request

Алексей Мезенин
источник
Ошибка: вызов неопределенного метода Illuminate \ Http \ Request :: put ()
Мортеза Негахи
put () - метод сбора, $ request-> all () возвращает массив.
Joel Hinz
3
У объекта запроса есть методы replace () и merge (). Я обычно предпочитаю их использовать. См. Мой комментарий к вопросу, чтобы получить ТАК-ответ на этот вопрос.
Джоэл Хинц
@JoelHinz, я думал, что они не работают в Laravel 5, потому что я видел несколько сообщений, в которых у парней были проблемы с использованием этих методов. Но я заглянул в Requestисходный код L5 и вижу эти методы. Спасибо.
Алексей Мезенин
4
Никакого пота. Однако ваш ответ все еще неверен. Метод replace () заменяет весь ввод - вам нужно merge (), если вы хотите заменить только одно значение.
Джоэл Хинц
8

Если вам нужно настроить запрос

$data = $request->all();

вы можете передать имя поля и значение

$data['product_ref_code'] = 1650;

и, наконец, передайте новый запрос

$last = Product::create($data);
Алаа Монеам
источник
3

Если вам нужно обновить свойство в запросе, я рекомендую вам использовать метод replace из класса Request, используемый Laravel.

$request->replace(['property to update' => $newValue]);
Ja Ouad
источник
1
Будьте осторожны, метод replace удаляет исходные данные запроса и заменяет все своим массивом. \ Symfony \ Component \ HttpFoundation \ ParameterBag строка 54 публичная функция replace (array $ parameters = []) {$ this-> parameters = $ parameters; }
Олег
2

Здесь отличные ответы, но мне нужно было заменить значение в запросе JSON. Немного покопавшись в коде, я придумал следующий код. Дай мне знать, если я делаю что-то глупое.

$json = $request->json()->all();
$json['field'] = 'new value';
$request->json()->replace($json);
Феникс
источник
2

Если вы используете настраиваемые запросы для проверки, для замены данных для проверки или для установки данных по умолчанию (для флажков или других), используйте метод переопределения 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'),
        ]);
    }
}

Надеюсь, эта информация будет кому-нибудь полезна.

Олег
источник
1

Это работает для меня

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

проверить вывод

$queryParams = $request->query();
dd($queryParams['yourParam']); // 2
Phuc
источник