วิธีเปลี่ยนค่าของพารามิเตอร์คำขอใน 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()ไปยังตัวแปรอื่น


187

พยายามที่จะ:

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

อีกวิธีในการทำ:

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

ขอบคุณ @JoelHinz สำหรับสิ่งนี้

หากคุณต้องการเพิ่มหรือเขียนทับข้อมูลที่ซ้อนกัน:

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

หากคุณไม่ฉีดRequest $requestวัตถุคุณสามารถใช้ตัวrequest()ช่วยระดับโลกหรือส่วน\Request::หน้าแทนได้$request


ข้อผิดพลาด: Call to undefined method Illuminate \ Http \ Request :: put ()
Morteza Negahi

put () เป็นวิธีการรวบรวม $ request-> all () ส่งคืนอาร์เรย์
Joel Hinz

3
อ็อบเจ็กต์คำขอมีวิธีการแทนที่ () และผสาน () ฉันมักชอบใช้สิ่งเหล่านี้ ดูความคิดเห็นของฉันเกี่ยวกับคำถามสำหรับคำตอบ SO เกี่ยวกับเรื่องนั้น
Joel Hinz

@JoelHinz ฉันคิดว่าพวกเขาไม่ได้ทำงานใน Laravel 5 เพราะฉันเห็นโพสต์ไม่กี่โพสต์ที่ผู้ชายมีปัญหากับการใช้วิธีการเหล่านี้ แต่ฉันได้ตรวจสอบRequestซอร์สโค้ดของ L5 และสามารถดูวิธีการเหล่านี้ได้ ขอบคุณ.
Alexey Mezenin

4
ไม่มีเหงื่อ. คำตอบของคุณยังคงผิดอยู่ วิธีการแทนที่ () แทนที่อินพุตทั้งหมด - คุณต้องผสาน () หากคุณต้องการแทนที่เพียงค่าเดียว
Joel Hinz

8

หากคุณต้องการปรับแต่งคำขอ

$data = $request->all();

คุณสามารถส่งชื่อของเขตข้อมูลและค่า

$data['product_ref_code'] = 1650;

และส่งคำขอใหม่ในที่สุด

$last = Product::create($data);

3

หากคุณต้องการอัปเดตคุณสมบัติในคำขอฉันขอแนะนำให้คุณใช้วิธีการแทนที่จากคลาสคำขอที่ Laravel ใช้

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

1
โปรดใช้ความระมัดระวังแทนที่วิธีการลบข้อมูล reqest เดิมและแทนที่ทั้งหมดด้วยอาร์เรย์ของคุณ \ Symfony \ Component \ HttpFoundation \ ParameterBag บรรทัด 54 ฟังก์ชันสาธารณะแทนที่ (array $ parameters = []) {$ this-> parameters = $ parameters; }
Oleg

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.