Skip to content

Commit 03448e5

Browse files
authored
Better Livewire support on RouteCollector (#1583)
1 parent 8a26490 commit 03448e5

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

src/DataCollector/RouteCollector.php

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,38 @@ protected function getRouteInformation($route)
5757
];
5858

5959
$result = array_merge($result, $action);
60+
$uses = $action['uses'] ?? null;
61+
$controller = is_string($action['controller'] ?? null) ? $action['controller'] : '';
62+
63+
if (request()->hasHeader('X-Livewire')) {
64+
try {
65+
$component = request('components')[0];
66+
$name = json_decode($component['snapshot'], true)['memo']['name'];
67+
$method = $component['calls'][0]['method'];
68+
$class = app(\Livewire\Mechanisms\ComponentRegistry::class)->getClass($name);
69+
if (class_exists($class) && method_exists($class, $method)) {
70+
$controller = $class . '@' . $method;
71+
$result['controller'] = ltrim($controller, '\\');
72+
}
73+
} catch (\Throwable $e) {
74+
//
75+
}
76+
}
6077

61-
62-
if (
63-
isset($action['controller'])
64-
&& is_string($action['controller'])
65-
&& strpos($action['controller'], '@') !== false
66-
) {
67-
list($controller, $method) = explode('@', $action['controller']);
78+
if (str_contains($controller, '@')) {
79+
list($controller, $method) = explode('@', $controller);
6880
if (class_exists($controller) && method_exists($controller, $method)) {
6981
$reflector = new \ReflectionMethod($controller, $method);
7082
}
7183
unset($result['uses']);
72-
} elseif (isset($action['uses']) && $action['uses'] instanceof \Closure) {
73-
$reflector = new \ReflectionFunction($action['uses']);
74-
$result['uses'] = $this->formatVar($result['uses']);
84+
} elseif ($uses instanceof \Closure) {
85+
$reflector = new \ReflectionFunction($uses);
86+
$result['uses'] = $this->formatVar($uses);
87+
} elseif (is_string($uses) && str_contains($uses, '@__invoke')) {
88+
if (class_exists($controller) && method_exists($controller, 'render')) {
89+
$reflector = new \ReflectionMethod($controller, 'render');
90+
$result['controller'] = $controller . '@render';
91+
}
7592
}
7693

7794
if (isset($reflector)) {

0 commit comments

Comments
 (0)