55use DebugBar \DataCollector \DataCollector ;
66use DebugBar \DataCollector \DataCollectorInterface ;
77use DebugBar \DataCollector \Renderable ;
8+ use Illuminate \Http \Request ;
89use Illuminate \Support \Arr ;
10+ use Illuminate \Support \Facades \Config ;
911use Illuminate \Support \Str ;
1012use Laravel \Telescope \IncomingEntry ;
1113use Laravel \Telescope \Telescope ;
14+ use Symfony \Component \HttpFoundation \RedirectResponse ;
1215use Symfony \Component \HttpFoundation \Response ;
1316
1417/**
@@ -20,7 +23,7 @@ class RequestCollector extends DataCollector implements DataCollectorInterface,
2023{
2124 /** @var \Symfony\Component\HttpFoundation\Request $request */
2225 protected $ request ;
23- /** @var \Symfony\Component\HttpFoundation\Request $response */
26+ /** @var \Symfony\Component\HttpFoundation\Response $response */
2427 protected $ response ;
2528 /** @var \Symfony\Component\HttpFoundation\Session\SessionInterface $session */
2629 protected $ session ;
@@ -63,14 +66,33 @@ public function getName()
6366 */
6467 public function getWidgets ()
6568 {
66- return [
69+ $ widgets = [
6770 "request " => [
6871 "icon " => "tags " ,
6972 "widget " => "PhpDebugBar.Widgets.HtmlVariableListWidget " ,
7073 "map " => "request " ,
7174 "default " => "{} "
7275 ]
7376 ];
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 ;
7496 }
7597
7698 /**
@@ -99,15 +121,37 @@ public function collect()
99121 }
100122
101123 $ statusCode = $ response ->getStatusCode ();
124+ $ startTime = defined ('LARAVEL_START ' ) ? LARAVEL_START : $ request ->server ->get ('REQUEST_TIME_FLOAT ' );
125+ $ query = $ request ->getQueryString ();
126+ $ htmlData = [];
102127
103128 $ 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 (
109152 'Content-Type '
110153 ) : 'text/html ' ,
154+ 'request_format ' => $ request ->getRequestFormat (),
111155 'request_query ' => $ request ->query ->all (),
112156 'request_request ' => $ request ->request ->all (),
113157 'request_headers ' => $ request ->headers ->all (),
@@ -137,7 +181,6 @@ public function collect()
137181 }
138182 }
139183
140- $ htmlData = [];
141184 if (class_exists (Telescope::class)) {
142185 $ entry = IncomingEntry::make ([
143186 'requestId ' => $ this ->currentRequestId ,
@@ -150,6 +193,81 @@ public function collect()
150193 return $ htmlData + $ data ;
151194 }
152195
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+
153271 private function getCookieHeader ($ name , $ value , $ expires , $ path , $ domain , $ secure , $ httponly )
154272 {
155273 $ cookie = sprintf ('%s=%s ' , $ name , urlencode ($ value ?? '' ));
0 commit comments