Laravel มีวิธีเพิ่มค่าให้กับอาร์เรย์คำขอ


114

ฉันเจอสถานการณ์ใน Laravel ในขณะที่เรียก store () หรือ update () method พร้อมกับ Request พารามิเตอร์เพื่อเพิ่มค่าเพิ่มเติมให้กับคำขอก่อนที่จะเรียกใช้ฟังก์ชัน Eloquent จะมีวิธีใดก็ตาม

function store(Request $request) 
{
  // some additional logic or checking
  User::create($request->all());
}

คุณต้องการทำทรีตเมนต์ประเภทใด? คุณต้องการเพิ่มค่าคีย์ใน$request->all()อาร์เรย์หรือไม่
Hammerbot

ใช่ฉันต้องการเพิ่มค่าคีย์
Vijayanand Premnath

คุณไม่สามารถใช้ตัวarray_add()ช่วยได้หรือไม่? $array = array_add($request->all(), 'new_key', $value);: laravel.com/docs/5.2/helpers#method-array-addหากนี่ไม่ใช่สิ่งที่คุณกำลังมองหาคุณสามารถให้ข้อมูลเพิ่มเติมสำหรับคำถามของคุณได้หรือไม่
Hammerbot

คำขอ $ เป็นวัตถุ php อย่างที่ฉันเข้าใจถ้าคุณต้องการเพิ่มคุณสมบัติบางอย่างในด้านข้างคอนโทรลเลอร์ให้แปลงวัตถุคำขอเป็นอาร์เรย์จากนั้นเพิ่มสิ่งที่คุณต้องการ
Chathura Hettiarachchi

คำตอบ:


208

โดยปกติคุณไม่ต้องการเพิ่มสิ่งใดในวัตถุคำขอจะดีกว่าถ้าใช้คอลเลกชันและตัวput()ช่วย:

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

หรือคุณสามารถรวมอาร์เรย์ :

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

แต่ถ้าคุณต้องการเพิ่มบางอย่างลงในอ็อบเจ็กต์ Request ให้ทำสิ่งนี้:

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

3
ใช่มันใช้งานได้สำหรับฉันตอนนี้ฉันเปลี่ยนรหัสเป็นที่เก็บฟังก์ชันแล้ว (ขอ $ request) {// ตรรกะเพิ่มเติมหรือตรวจสอบ $ plan = 123; // ตรรกะบางอย่างในการตัดสินใจแผนของผู้ใช้ $ request-> request-> add (['plan' => $ plan]); ผู้ใช้ :: สร้าง ($ request-> all ()); }
Vijayanand Premnath

1
สิ่งนี้ใช้ไม่ได้เนื่องจาก $ request-> all () เป็นอาร์เรย์ไม่ใช่คอลเล็กชัน
kjdion84

1
ฉันเดาว่าต้องเป็น $ request-> request-> add (['variable' => 'value']);
Sergey Onishchenko

$ request-> request-> add ... ฉันได้รับข้อความแสดงข้อผิดพลาด「 Undefined variable: request 」 แต่ฉันมีข้อความ「 use Illuminate \ Http \ Request; 」ทำไมฉันถึงได้รับข้อความแสดงข้อผิดพลาด
robspin

ฉันต้อง $ request = collect (); อันดับแรก? $ resquest คอลเลกชันหรืออาร์เรย์?
robspin

59

อ้างถึงAlexey Mezeninคำตอบ:

ในขณะที่ใช้คำตอบของเขาฉันต้องเพิ่มบางสิ่งลงใน Request Object โดยตรงและใช้:

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

การใช้สิ่งนี้จะเพิ่มตัวแปรสองตัว:

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

หากคุณเป็นมือใหม่เช่นฉันและคุณต้องการอาร์เรย์ผู้ร่วมงานวิธีที่ถูกต้องคือ

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

หวังว่าฉันจะช่วยคุณได้บ้าง

PS: ขอบคุณ@Alexeyจริงๆคุณช่วยฉันด้วยคำตอบของคุณ


$ request-> request-> add ... ฉันได้รับข้อความแสดงข้อผิดพลาด「 Undefined variable: request 」 แต่ฉันมีข้อความ「 use Illuminate \ Http \ Request; 」ทำไมฉันถึงได้รับข้อความแสดงข้อผิดพลาด
robspin

@robspin ฉันคิดว่ามันค่อนข้างช้า แต่คุณอาจไม่ได้ฉีดคำร้องในฟังก์ชันเช่นฟังก์ชัน (ขอ $ request)
mushood badulla

1
สำหรับพวกคุณที่กำลังมองหาสาเหตุที่ค่าของคุณไม่ถูกแทรกในฐานข้อมูลเนื่องจากฉันไม่ได้ประกาศค่าของฐานข้อมูลในModelคลาสของฉันเป็น:protected $fillable = ['slug'];
fWd82


17

พอพูดในเรื่องนี้ แต่ฉันอดไม่ได้ที่จะเพิ่มคำตอบของตัวเอง ฉันเชื่อว่าแนวทางที่ง่ายที่สุดคือ

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

16

ใน laravel 5.6 เราสามารถส่งผ่านพารามิเตอร์ระหว่าง Middlewares ได้เช่น:

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());
}

1
$request->merge()วิธีนั้นFTW! ขอบคุณ.
Martin Joiner

15

คุณยังสามารถใช้โค้ดด้านล่าง

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

เหมาะกับฉันมากขึ้น


อย่างน้อยก็ด้วย Laravel 5.6 นี่คือวิธีการทำ! คำตอบที่ดี
Rockin4Life33

4

ในการเพิ่มพารามิเตอร์ใหม่สำหรับ ex: newParamให้กับRequestObject ปัจจุบันคุณสามารถทำได้:

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

หลังจากเพิ่มพารามิเตอร์ใหม่คุณจะสามารถเห็นพารามิเตอร์ที่เพิ่มใหม่นี้ไปยังอ็อบเจ็กต์ Request โดย:

dd($request);//prints the contents of the Request object

3

จากการสังเกตของฉัน :

$request->request->add(['variable' => 'value']);จะ (ส่วนใหญ่) ในการทำงานในPOST, PUT ลบวิธีการเพราะมีค่า (s) _tokenผ่านไปหนึ่งในนั้นคือ เช่นตัวอย่างด้านล่าง

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

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

แต่ [รหัสด้านล่าง] จะไม่ทำงานเนื่องจากไม่มีการส่งผ่านค่าจึงไม่ได้เพิ่ม

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

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


เมื่อใช้เมธอด GETคุณสามารถประกาศคำขอและกำหนดค่าได้โดยตรง ชอบด้านล่าง:

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

หรือคุณสามารถใช้merge. สิ่งนี้ดีกว่า$request->request->add(['variable' => 'value']);เนื่องจากสามารถเริ่มต้นและเพิ่มค่าการร้องขอที่จะใช้ได้กับทุกวิธี ( GET , POST , PUT , DELETE )

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

แท็ก: laravel5.8.11




2

สิ่งที่ดีที่สุดที่ฉันเคยใช้และค้นคว้าเกี่ยวกับเรื่องนี้คือ$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']));
}

ตรวจสอบบรรทัด # 3 ภายในฟังก์ชันดัชนี


0

คุณสามารถเพิ่มพารามิเตอร์ให้กับคำขอจากมิดเดิลแวร์ได้โดยทำดังนี้

public function handle($request, Closure $next)
{
    $request->route()->setParameter('foo', 'bar');
    return $next($request);
}

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