7
7
use Illuminate \Contracts \Support \Arrayable ;
8
8
use Illuminate \Contracts \Support \Responsable ;
9
9
use Illuminate \Http \JsonResponse ;
10
+ use Illuminate \Http \Request ;
10
11
use Illuminate \Http \Resources \Json \JsonResource ;
11
12
use Illuminate \Http \Resources \Json \ResourceResponse ;
12
13
use Illuminate \Support \Arr ;
@@ -93,34 +94,7 @@ public function toResponse($request)
93
94
return ! ($ prop instanceof LazyProp);
94
95
});
95
96
96
- array_walk_recursive ($ props , static function (&$ prop ) use ($ request ) {
97
- if ($ prop instanceof LazyProp) {
98
- $ prop = App::call ($ prop );
99
- }
100
-
101
- if ($ prop instanceof Closure) {
102
- $ prop = App::call ($ prop );
103
- }
104
-
105
- if ($ prop instanceof PromiseInterface) {
106
- $ prop = $ prop ->wait ();
107
- }
108
-
109
- if ($ prop instanceof ResourceResponse || $ prop instanceof JsonResource) {
110
- $ prop = $ prop ->toResponse ($ request )->getData (true );
111
- }
112
-
113
- if ($ prop instanceof Arrayable) {
114
- $ prop = $ prop ->toArray ();
115
- }
116
- });
117
-
118
- foreach ($ props as $ key => $ value ) {
119
- if (str_contains ($ key , '. ' )) {
120
- data_set ($ props , $ key , $ value );
121
- unset($ props [$ key ]);
122
- }
123
- }
97
+ $ props = $ this ->resolvePropertyInstances ($ props , $ request );
124
98
125
99
$ page = [
126
100
'component ' => $ this ->component ,
@@ -138,4 +112,44 @@ public function toResponse($request)
138
112
139
113
return ResponseFactory::view ($ this ->rootView , $ this ->viewData + ['page ' => $ page ]);
140
114
}
115
+
116
+ /**
117
+ * Resolve all necessary class instances in the given props.
118
+ *
119
+ * @param array $props
120
+ * @param \Illuminate\Http\Request $request
121
+ * @return array
122
+ */
123
+ public function resolvePropertyInstances (array $ props , Request $ request ): array
124
+ {
125
+ foreach ($ props as $ key => $ value ) {
126
+ if ($ value instanceof Closure) {
127
+ $ value = App::call ($ value );
128
+ }
129
+
130
+ if ($ value instanceof LazyProp) {
131
+ $ value = App::call ($ value );
132
+ }
133
+
134
+ if ($ value instanceof PromiseInterface) {
135
+ $ value = $ value ->wait ();
136
+ }
137
+
138
+ if ($ value instanceof ResourceResponse || $ value instanceof JsonResource) {
139
+ $ value = $ value ->toResponse ($ request )->getData (true );
140
+ }
141
+
142
+ if ($ value instanceof Arrayable) {
143
+ $ value = $ value ->toArray ();
144
+ }
145
+
146
+ if (is_array ($ value )) {
147
+ $ value = $ this ->resolvePropertyInstances ($ value , $ request );
148
+ }
149
+
150
+ Arr::set ($ props , $ key , $ value );
151
+ }
152
+
153
+ return $ props ;
154
+ }
141
155
}
0 commit comments