22
33namespace Spatie \LaravelFlare \AttributesProviders ;
44
5+ use Closure ;
56use Illuminate \Database \Eloquent \Model ;
67use Illuminate \Http \Request as LaravelRequest ;
8+ use Illuminate \Routing \RedirectController ;
79use Illuminate \Routing \Route ;
10+ use Illuminate \Routing \ViewController ;
811use Livewire \LivewireManager ;
12+ use ReflectionFunction ;
913use Spatie \FlareClient \AttributesProviders \RequestAttributesProvider as BaseRequestAttributesProvider ;
14+ use Spatie \LaravelFlare \Enums \LaravelRouteActionType ;
1015use Symfony \Component \HttpFoundation \Request ;
1116use Throwable ;
1217
1318class LaravelRequestAttributesProvider extends BaseRequestAttributesProvider
1419{
15- public function toArray (Request $ request , bool $ includeContents = true , bool $ includeLivewireComponents = false ): array
16- {
20+ /**
21+ * @param array<string> $ignoreLivewireComponents
22+ */
23+ public function toArray (
24+ Request $ request ,
25+ bool $ includeContents = true ,
26+ bool $ includeLivewireComponents = false ,
27+ array $ ignoreLivewireComponents = []
28+ ): array {
1729 if (! $ request instanceof LaravelRequest) {
1830 return parent ::toArray ($ request , $ includeContents );
1931 }
@@ -34,7 +46,7 @@ public function toArray(Request $request, bool $includeContents = true, bool $in
3446
3547 return array_merge (
3648 $ attributes ,
37- $ provider ->toArray ($ request , $ livewireManager)
49+ $ provider ->toArray ($ request , $ livewireManager, $ ignoreLivewireComponents ),
3850 );
3951 } catch (Throwable ) {
4052 return $ attributes ;
@@ -72,10 +84,8 @@ protected function getRoute(LaravelRequest $request): array
7284 'http.route ' => $ route ->uri (),
7385 'laravel.route.name ' => $ route ->getName (),
7486 'laravel.route.parameters ' => $ this ->getRouteParameters ($ route ),
75- 'laravel.route.action ' => $ route ->getActionName (),
7687 'laravel.route.middleware ' => array_values ($ route ->gatherMiddleware ()),
77-
78- 'flare.entry_point.class ' => $ route ->getActionName (),
88+ ...$ this ->getActionAttributes ($ route ),
7989 ];
8090 }
8191
@@ -99,4 +109,50 @@ protected function isRunningLiveWire(LaravelRequest $request): bool
99109 {
100110 return $ request ->hasHeader ('x-livewire ' ) && $ request ->hasHeader ('referer ' );
101111 }
112+
113+ protected function getActionAttributes (Route $ route ): array
114+ {
115+ $ actionName = $ route ->getActionName ();
116+ $ type = LaravelRouteActionType::Controller;
117+
118+ if ($ actionName === '\\' .ViewController::class
119+ && ($ view = $ route ->parameter ('view ' ))
120+ && is_string ($ view )
121+ ) {
122+ $ actionName = "view: {$ view }" ;
123+ $ type = LaravelRouteActionType::View;
124+ }
125+
126+ if ($ actionName === '\\' .RedirectController::class
127+ && ($ destination = $ route ->parameter ('destination ' ))
128+ && is_string ($ destination )
129+ ) {
130+ $ actionName = "redirect: {$ destination }" ;
131+ $ type = LaravelRouteActionType::Redirect;
132+ }
133+
134+ if ($ actionName === 'Closure ' && $ route ->getAction ('uses ' ) instanceof Closure) {
135+ try {
136+ $ closure = $ route ->getAction ('uses ' );
137+
138+ $ reflection = new ReflectionFunction ($ closure );
139+
140+ $ filename = str_replace (
141+ rtrim (base_path (), '/ ' ).'/ ' ,
142+ '' ,
143+ $ reflection ->getFileName () ?: 'unknown file ' ,
144+ );
145+
146+ $ actionName = "closure: {$ filename }" ;
147+ $ type = LaravelRouteActionType::Closure;
148+ } catch (Throwable ) {
149+ }
150+ }
151+
152+ return [
153+ 'laravel.route.action ' => $ actionName ,
154+ 'laravel.route.action_type ' => $ type ,
155+ 'flare.entry_point.class ' => $ actionName ,
156+ ];
157+ }
102158}
0 commit comments