@@ -395,6 +395,142 @@ public function testResolveRequestRedirectsForWildcardAcceptHeader(): void
395395 $ this ->assertSame (303 , $ response ->getStatusCode ());
396396 }
397397
398+ public function testPreparedValidationDataIsPassedToFailedValidationWithoutPreparingAgain (): void
399+ {
400+ service ('superglobals ' )->setPost ('title ' , ' Hello World ' );
401+
402+ $ formRequest = new class ($ this ->makeRequest ()) extends FormRequest {
403+ public int $ prepareCount = 0 ;
404+
405+ /**
406+ * @var array<string, mixed>
407+ */
408+ public array $ preparedData = [];
409+
410+ public function rules (): array
411+ {
412+ return [
413+ 'title ' => 'required ' ,
414+ 'body ' => 'required ' ,
415+ ];
416+ }
417+
418+ protected function prepareForValidation (array $ data ): array
419+ {
420+ $ this ->prepareCount ++;
421+ $ data ['title ' ] = trim ($ data ['title ' ] ?? '' );
422+
423+ return $ data ;
424+ }
425+
426+ protected function failedValidation (array $ errors , array $ preparedData ): ResponseInterface
427+ {
428+ $ this ->preparedData = $ preparedData ;
429+
430+ return service ('response ' )->setStatusCode (422 )->setJSON (['errors ' => $ errors ]);
431+ }
432+ };
433+
434+ $ formRequest ->resolveRequest ();
435+
436+ $ this ->assertSame (1 , $ formRequest ->prepareCount );
437+ $ this ->assertSame (['title ' => 'Hello World ' ], $ formRequest ->preparedData );
438+ }
439+
440+ #[RunInSeparateProcess]
441+ public function testDefaultFailedValidationFlashesPreparedValidationDataAsOldInput (): void
442+ {
443+ /** @var array<string, mixed> $_SESSION */
444+ $ _SESSION = [];
445+
446+ service ('superglobals ' )->setPost ('title ' , ' Hello World ' );
447+
448+ $ formRequest = new class ($ this ->makeRequest ()) extends FormRequest {
449+ public function rules (): array
450+ {
451+ return [
452+ 'title ' => 'required ' ,
453+ 'body ' => 'required ' ,
454+ ];
455+ }
456+
457+ protected function prepareForValidation (array $ data ): array
458+ {
459+ $ data ['title ' ] = trim ($ data ['title ' ] ?? '' );
460+
461+ return $ data ;
462+ }
463+ };
464+
465+ $ formRequest ->resolveRequest ();
466+
467+ $ this ->assertSame (['title ' => 'Hello World ' ], $ _SESSION ['_ci_old_input ' ]['post ' ]);
468+ }
469+
470+ #[RunInSeparateProcess]
471+ public function testDefaultFailedValidationFlashesPreparedGetDataAsOldInput (): void
472+ {
473+ /** @var array<string, mixed> $_SESSION */
474+ $ _SESSION = [];
475+
476+ service ('superglobals ' )->setServer ('REQUEST_METHOD ' , 'GET ' );
477+ service ('superglobals ' )->setGet ('title ' , ' Hello World ' );
478+
479+ $ formRequest = new class ($ this ->makeRequest ()) extends FormRequest {
480+ public function rules (): array
481+ {
482+ return [
483+ 'title ' => 'required ' ,
484+ 'body ' => 'required ' ,
485+ ];
486+ }
487+
488+ protected function prepareForValidation (array $ data ): array
489+ {
490+ $ data ['title ' ] = trim ($ data ['title ' ] ?? '' );
491+
492+ return $ data ;
493+ }
494+ };
495+
496+ $ formRequest ->resolveRequest ();
497+
498+ $ this ->assertSame (['title ' => 'Hello World ' ], $ _SESSION ['_ci_old_input ' ]['get ' ]);
499+ $ this ->assertSame ([], $ _SESSION ['_ci_old_input ' ]['post ' ]);
500+ }
501+
502+ #[RunInSeparateProcess]
503+ public function testDefaultFailedValidationPreservesGetDataWhenPostDataIsPrepared (): void
504+ {
505+ /** @var array<string, mixed> $_SESSION */
506+ $ _SESSION = [];
507+
508+ service ('superglobals ' )->setGet ('category ' , '2 ' );
509+ service ('superglobals ' )->setPost ('title ' , ' Hello World ' );
510+
511+ $ formRequest = new class ($ this ->makeRequest ()) extends FormRequest {
512+ public function rules (): array
513+ {
514+ return [
515+ 'title ' => 'required ' ,
516+ 'body ' => 'required ' ,
517+ ];
518+ }
519+
520+ protected function prepareForValidation (array $ data ): array
521+ {
522+ $ data ['title ' ] = trim ($ data ['title ' ] ?? '' );
523+
524+ return $ data ;
525+ }
526+ };
527+
528+ $ formRequest ->resolveRequest ();
529+
530+ $ this ->assertSame (['category ' => '2 ' ], $ _SESSION ['_ci_old_input ' ]['get ' ]);
531+ $ this ->assertSame (['title ' => 'Hello World ' ], $ _SESSION ['_ci_old_input ' ]['post ' ]);
532+ }
533+
398534 // -------------------------------------------------------------------------
399535 // Authorization failure
400536 // -------------------------------------------------------------------------
@@ -488,7 +624,7 @@ public function rules(): array
488624 return ['title ' => 'required ' ];
489625 }
490626
491- protected function failedValidation (array $ errors ): ResponseInterface
627+ protected function failedValidation (array $ errors, array $ preparedData ): ResponseInterface
492628 {
493629 self ::$ called = true ;
494630
0 commit comments