From f4f0a6c6919b727f585393ffff05dae601975c48 Mon Sep 17 00:00:00 2001 From: Rodrigo Pedra Brum Date: Tue, 4 Dec 2018 04:07:31 -0200 Subject: [PATCH] [5.7] Backport #26486 - Fix validation triggering twice --- .../Foundation/Http/FormRequest.php | 26 +++++++++++++-- .../Foundation/FoundationFormRequestTest.php | 33 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Foundation/Http/FormRequest.php b/src/Illuminate/Foundation/Http/FormRequest.php index 22883d4b78ac..b5fcaab6abae 100644 --- a/src/Illuminate/Foundation/Http/FormRequest.php +++ b/src/Illuminate/Foundation/Http/FormRequest.php @@ -58,6 +58,13 @@ class FormRequest extends Request implements ValidatesWhenResolved */ protected $errorBag = 'default'; + /** + * The validator instance. + * + * @var \Illuminate\Contracts\Validation\Validator + */ + protected $validator; + /** * Get the validator instance for the request. * @@ -77,7 +84,9 @@ protected function getValidatorInstance() $this->withValidator($validator); } - return $validator; + $this->setValidator($validator); + + return $this->validator; } /** @@ -172,7 +181,7 @@ protected function failedAuthorization() */ public function validated() { - return $this->getValidatorInstance()->validated(); + return $this->validator->validated(); } /** @@ -195,6 +204,19 @@ public function attributes() return []; } + /** + * Set the Validator instance. + * + * @param \Illuminate\Contracts\Validation\Validator $validator + * @return $this + */ + public function setValidator(Validator $validator) + { + $this->validator = $validator; + + return $this; + } + /** * Set the Redirector instance. * diff --git a/tests/Foundation/FoundationFormRequestTest.php b/tests/Foundation/FoundationFormRequestTest.php index 8bc0505479ea..991cbcc8be56 100644 --- a/tests/Foundation/FoundationFormRequestTest.php +++ b/tests/Foundation/FoundationFormRequestTest.php @@ -10,6 +10,7 @@ use Illuminate\Routing\UrlGenerator; use Illuminate\Http\RedirectResponse; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Contracts\Validation\Validator; use Illuminate\Contracts\Translation\Translator; use Illuminate\Validation\Factory as ValidationFactory; use Illuminate\Contracts\Validation\Factory as ValidationFactoryContract; @@ -67,6 +68,15 @@ public function test_validated_method_returns_the_validated_data_nested_array_ru $this->assertEquals(['nested' => [['bar' => 'baz'], ['bar' => 'baz2']]], $request->validated()); } + public function test_validated_method_not_validate_twice() + { + $payload = ['name' => 'specified', 'with' => 'extras']; + $request = $this->createRequest($payload, FoundationTestFormRequestTwiceStub::class); + $request->validateResolved(); + $request->validated(); + $this->assertEquals(1, FoundationTestFormRequestTwiceStub::$count); + } + /** * @expectedException \Illuminate\Validation\ValidationException */ @@ -246,6 +256,28 @@ public function authorize() } } +class FoundationTestFormRequestTwiceStub extends FormRequest +{ + public static $count = 0; + + public function rules() + { + return ['name' => 'required']; + } + + public function withValidator(Validator $validator) + { + $validator->after(function ($validator) { + self::$count++; + }); + } + + public function authorize() + { + return true; + } +} + class FoundationTestFormRequestForbiddenStub extends FormRequest { public function authorize() @@ -253,6 +285,7 @@ public function authorize() return false; } } + class FoundationTestFormRequestHooks extends FormRequest { public function rules()