diff --git a/src/Illuminate/Http/Request.php b/src/Illuminate/Http/Request.php index 934488bd2a40..06bc955633fb 100644 --- a/src/Illuminate/Http/Request.php +++ b/src/Illuminate/Http/Request.php @@ -331,6 +331,19 @@ public function merge(array $input) return $this; } + /** + * Merge new input into the request's input, but only when that key is missing from the request. + * + * @param array $input + * @return $this + */ + public function mergeIfMissing(array $input) + { + return $this->merge(collect($input)->filter(function ($value, $key) { + return $this->missing($key); + })->toArray()); + } + /** * Replace the input for the current request. * diff --git a/tests/Http/HttpRequestTest.php b/tests/Http/HttpRequestTest.php index 3a82b0a2cdf9..f625aa9e4723 100644 --- a/tests/Http/HttpRequestTest.php +++ b/tests/Http/HttpRequestTest.php @@ -752,6 +752,21 @@ public function testMergeMethod() $this->assertSame('Dayle', $request->input('buddy')); } + public function testMergeIfMissingMethod() + { + $request = Request::create('/', 'GET', ['name' => 'Taylor']); + $merge = ['boolean_setting' => 0]; + $request->mergeIfMissing($merge); + $this->assertSame('Taylor', $request->input('name')); + $this->assertSame(0, $request->input('boolean_setting')); + + $request = Request::create('/', 'GET', ['name' => 'Taylor', 'boolean_setting' => 1]); + $merge = ['boolean_setting' => 0]; + $request->mergeIfMissing($merge); + $this->assertSame('Taylor', $request->input('name')); + $this->assertSame(1, $request->input('boolean_setting')); + } + public function testReplaceMethod() { $request = Request::create('/', 'GET', ['name' => 'Taylor']);