diff --git a/src/Webhooks.php b/src/Webhooks.php index 92dd595c..70e1ea85 100644 --- a/src/Webhooks.php +++ b/src/Webhooks.php @@ -95,18 +95,19 @@ private static function registerSignalWebhooks($workflow, $basePath) foreach (self::getSignalMethods($workflow) as $method) { if (self::hasWebhookAttributeOnMethod($method)) { $slug = Str::kebab(class_basename($workflow)); - $signal = Str::kebab($method->getName()); + $signalMethod = $method->getName(); + $signal = Str::kebab($signalMethod); Route::post( "{$basePath}/signal/{$slug}/{workflowId}/{$signal}", - static function (Request $request, $workflowId) use ($workflow, $method) { + static function (Request $request, $workflowId) use ($workflow, $signalMethod) { $request = self::validateAuth($request); $workflowInstance = WorkflowStub::load($workflowId); $params = self::resolveNamedParameters( $workflow, - $method->getName(), + $signalMethod, $request->except('workflowId') ); - $workflowInstance->{$method->getName()}(...$params); + $workflowInstance->{$signalMethod}(...$params); return response()->json([ 'message' => 'Signal sent', ]); diff --git a/tests/Unit/WebhooksTest.php b/tests/Unit/WebhooksTest.php index 9fd3d455..d30c55ad 100644 --- a/tests/Unit/WebhooksTest.php +++ b/tests/Unit/WebhooksTest.php @@ -391,6 +391,26 @@ public function testSignalUnauthorized(): void 'message' => 'Unauthorized', ]); } + + public function testWebhookRoutesCanBeSerializedForRouteCaching() + { + $webhookRoutes = []; + + foreach (Route::getRoutes() as $route) { + if (str_starts_with((string) $route->getName(), 'workflows.')) { + $webhookRoutes[] = $route; + } + } + + $this->assertNotEmpty($webhookRoutes); + + foreach ($webhookRoutes as $route) { + // Mirrors what `php artisan route:cache` does. Closures must only + // capture serializable values (no ReflectionMethod instances). + $route->prepareForSerialization(); + serialize($route); + } + } } class TestClass