5
5
use DebugBar \DataCollector \DataCollector ;
6
6
use DebugBar \DataCollector \DataCollectorInterface ;
7
7
use DebugBar \DataCollector \Renderable ;
8
+ use Illuminate \Http \Request ;
8
9
use Illuminate \Support \Arr ;
10
+ use Illuminate \Support \Facades \Config ;
9
11
use Illuminate \Support \Str ;
10
12
use Laravel \Telescope \IncomingEntry ;
11
13
use Laravel \Telescope \Telescope ;
14
+ use Symfony \Component \HttpFoundation \RedirectResponse ;
12
15
use Symfony \Component \HttpFoundation \Response ;
13
16
14
17
/**
@@ -20,7 +23,7 @@ class RequestCollector extends DataCollector implements DataCollectorInterface,
20
23
{
21
24
/** @var \Symfony\Component\HttpFoundation\Request $request */
22
25
protected $ request ;
23
- /** @var \Symfony\Component\HttpFoundation\Request $response */
26
+ /** @var \Symfony\Component\HttpFoundation\Response $response */
24
27
protected $ response ;
25
28
/** @var \Symfony\Component\HttpFoundation\Session\SessionInterface $session */
26
29
protected $ session ;
@@ -63,14 +66,33 @@ public function getName()
63
66
*/
64
67
public function getWidgets ()
65
68
{
66
- return [
69
+ $ widgets = [
67
70
"request " => [
68
71
"icon " => "tags " ,
69
72
"widget " => "PhpDebugBar.Widgets.HtmlVariableListWidget " ,
70
73
"map " => "request " ,
71
74
"default " => "{} "
72
75
]
73
76
];
77
+
78
+ if (Config::get ('debugbar.options.request.label ' , true )) {
79
+ $ widgets ['currentrequest ' ] = [
80
+ "icon " => "share " ,
81
+ "tooltip " => [
82
+ 'status ' => $ this ->response ->getStatusCode ()
83
+ ],
84
+ "map " => "request.uri " ,
85
+ "link " => "request " ,
86
+ "default " => ""
87
+ ];
88
+ if ($ this ->request instanceof Request) {
89
+ $ widgets ['currentrequest ' ]['tooltip ' ] += [
90
+ 'controller_action ' => optional ($ this ->request ->route ())->getActionName (),
91
+ ];
92
+ }
93
+ }
94
+
95
+ return $ widgets ;
74
96
}
75
97
76
98
/**
@@ -99,15 +121,37 @@ public function collect()
99
121
}
100
122
101
123
$ statusCode = $ response ->getStatusCode ();
124
+ $ startTime = defined ('LARAVEL_START ' ) ? LARAVEL_START : $ request ->server ->get ('REQUEST_TIME_FLOAT ' );
125
+ $ query = $ request ->getQueryString ();
126
+ $ htmlData = [];
102
127
103
128
$ data = [
104
- 'path_info ' => $ request ->getPathInfo (),
105
- 'status_code ' => $ statusCode ,
106
- 'status_text ' => isset (Response::$ statusTexts [$ statusCode ]) ? Response::$ statusTexts [$ statusCode ] : '' ,
107
- 'format ' => $ request ->getRequestFormat (),
108
- 'content_type ' => $ response ->headers ->get ('Content-Type ' ) ? $ response ->headers ->get (
129
+ 'status ' => $ statusCode . ' ' . (isset (Response::$ statusTexts [$ statusCode ]) ? Response::$ statusTexts [$ statusCode ] : '' ),
130
+ 'duration ' => $ startTime ? $ this ->formatDuration (microtime (true ) - $ startTime ) : null ,
131
+ 'peak_memory ' => $ this ->formatBytes (memory_get_peak_usage (true ), 1 ),
132
+ ];
133
+
134
+ if ($ request instanceof Request) {
135
+
136
+ if ($ route = $ request ->route ()) {
137
+ $ htmlData += $ this ->getRouteInformation ($ route );
138
+ }
139
+
140
+ $ fulLUrl = $ request ->fullUrl ();
141
+ $ data += [
142
+ 'full_url ' => strlen ($ fulLUrl ) > 100 ? [$ fulLUrl ] : $ fulLUrl ,
143
+ ];
144
+ }
145
+
146
+ if ($ response instanceof RedirectResponse) {
147
+ $ data ['response ' ] = 'Redirect to ' . $ response ->getTargetUrl ();
148
+ }
149
+
150
+ $ data += [
151
+ 'response ' => $ response ->headers ->get ('Content-Type ' ) ? $ response ->headers ->get (
109
152
'Content-Type '
110
153
) : 'text/html ' ,
154
+ 'request_format ' => $ request ->getRequestFormat (),
111
155
'request_query ' => $ request ->query ->all (),
112
156
'request_request ' => $ request ->request ->all (),
113
157
'request_headers ' => $ request ->headers ->all (),
@@ -137,7 +181,6 @@ public function collect()
137
181
}
138
182
}
139
183
140
- $ htmlData = [];
141
184
if (class_exists (Telescope::class)) {
142
185
$ entry = IncomingEntry::make ([
143
186
'requestId ' => $ this ->currentRequestId ,
@@ -150,6 +193,81 @@ public function collect()
150
193
return $ htmlData + $ data ;
151
194
}
152
195
196
+ protected function getRouteInformation ($ route )
197
+ {
198
+ if (!is_a ($ route , 'Illuminate\Routing\Route ' )) {
199
+ return [];
200
+ }
201
+ $ uri = head ($ route ->methods ()) . ' ' . $ route ->uri ();
202
+ $ action = $ route ->getAction ();
203
+
204
+ $ result = [
205
+ 'uri ' => $ uri ?: '- ' ,
206
+ ];
207
+
208
+ $ result = array_merge ($ result , $ action );
209
+ $ uses = $ action ['uses ' ] ?? null ;
210
+ $ controller = is_string ($ action ['controller ' ] ?? null ) ? $ action ['controller ' ] : '' ;
211
+
212
+ if (request ()->hasHeader ('X-Livewire ' )) {
213
+ try {
214
+ $ component = request ('components ' )[0 ];
215
+ $ name = json_decode ($ component ['snapshot ' ], true )['memo ' ]['name ' ];
216
+ $ method = $ component ['calls ' ][0 ]['method ' ];
217
+ $ class = app (\Livewire \Mechanisms \ComponentRegistry::class)->getClass ($ name );
218
+ if (class_exists ($ class ) && method_exists ($ class , $ method )) {
219
+ $ controller = $ class . '@ ' . $ method ;
220
+ $ result ['controller ' ] = ltrim ($ controller , '\\' );
221
+ }
222
+ } catch (\Throwable $ e ) {
223
+ //
224
+ }
225
+ }
226
+
227
+ if (str_contains ($ controller , '@ ' )) {
228
+ list ($ controller , $ method ) = explode ('@ ' , $ controller );
229
+ if (class_exists ($ controller ) && method_exists ($ controller , $ method )) {
230
+ $ reflector = new \ReflectionMethod ($ controller , $ method );
231
+ }
232
+ unset($ result ['uses ' ]);
233
+ } elseif ($ uses instanceof \Closure) {
234
+ $ reflector = new \ReflectionFunction ($ uses );
235
+ $ result ['uses ' ] = $ this ->formatVar ($ uses );
236
+ } elseif (is_string ($ uses ) && str_contains ($ uses , '@__invoke ' )) {
237
+ if (class_exists ($ controller ) && method_exists ($ controller , 'render ' )) {
238
+ $ reflector = new \ReflectionMethod ($ controller , 'render ' );
239
+ $ result ['controller ' ] = $ controller . '@render ' ;
240
+ }
241
+ }
242
+
243
+ if (isset ($ reflector )) {
244
+ $ filename = $ this ->normalizeFilePath ($ reflector ->getFileName ());
245
+
246
+ if ($ link = $ this ->getXdebugLink ($ reflector ->getFileName (), $ reflector ->getStartLine ())) {
247
+ $ result ['file ' ] = sprintf (
248
+ '<a href="%s" onclick="%s" class="phpdebugbar-widgets-editor-link">%s:%s-%s</a> ' ,
249
+ $ link ['url ' ],
250
+ $ link ['ajax ' ] ? 'event.preventDefault();$.ajax(this.href); ' : '' ,
251
+ $ filename ,
252
+ $ reflector ->getStartLine (),
253
+ $ reflector ->getEndLine ()
254
+ );
255
+
256
+ if (isset ($ result ['controller ' ])) {
257
+ $ result ['controller ' ] .= '<a href=" ' .$ link ['url ' ].'" class="phpdebugbar-widgets-editor-link"></a> ' ;
258
+ }
259
+ } else {
260
+ $ result ['file ' ] = sprintf ('%s:%s-%s ' , $ filename , $ reflector ->getStartLine (), $ reflector ->getEndLine ());
261
+ }
262
+ }
263
+
264
+ if (isset ($ result ['middleware ' ]) && is_array ($ result ['middleware ' ])) {
265
+ $ result ['middleware ' ] = implode (', ' , $ result ['middleware ' ]);
266
+ }
267
+
268
+ return array_filter ($ result );
269
+ }
270
+
153
271
private function getCookieHeader ($ name , $ value , $ expires , $ path , $ domain , $ secure , $ httponly )
154
272
{
155
273
$ cookie = sprintf ('%s=%s ' , $ name , urlencode ($ value ?? '' ));
0 commit comments