1+ <?php
2+
3+ namespace Lextira \FormRequestSingleton ;
4+
5+ use Illuminate \Contracts \Foundation \Application ;
6+ use Illuminate \Contracts \Validation \ValidatesWhenResolved ;
7+ use Illuminate \Foundation \Http \FormRequest ;
8+ use Illuminate \Http \Request ;
9+ use Illuminate \Routing \Redirector ;
10+ use Illuminate \Support \ServiceProvider ;
11+
12+ class FormRequestServiceProvider extends ServiceProvider
13+ {
14+ /**
15+ * Register the service provider.
16+ *
17+ * @return void
18+ */
19+ public function register ()
20+ {
21+ //
22+ }
23+
24+ /**
25+ * Bootstrap the application services.
26+ *
27+ * @return void
28+ */
29+ public function boot ()
30+ {
31+ $ this ->app ->resolving (FormRequest::class, function ($ request , Application $ app ) {
32+
33+ // if the request is already bound, we don't need to do anything.
34+ if ($ app ->bound (get_class ($ request ))) {
35+ return ;
36+ }
37+
38+ // but if not, we resolve a new FromRequest and register it as singleton.
39+ $ this ->resolveFormRequestAndRegisterAsSingleton ($ request , $ app );
40+ });
41+ }
42+
43+ /**
44+ * Resolve a new FormRequest instance and bind it as singleton.
45+ *
46+ * @param \Illuminate\Http\Request $request
47+ * @param \Illuminate\Contracts\Foundation\Application $app
48+ * @throws
49+ */
50+ protected function resolveFormRequestAndRegisterAsSingleton (Request $ request , Application $ app )
51+ {
52+ $ request = FormRequest::createFrom ($ app ['request ' ], $ request );
53+
54+ $ request ->setContainer ($ app )->setRedirector ($ app ->make (Redirector::class));
55+
56+ if ($ request instanceof ValidatesWhenResolved) {
57+ $ request ->validateResolved ();
58+ }
59+
60+ $ app ->singleton (get_class ($ request ), function (Application $ app ) use ($ request ) {
61+ return $ request ;
62+ });
63+ }
64+ }
0 commit comments