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