{"id":"70dc0f70e11a869a","repo":"laravel/framework","slug":"given-channel-handler-is-an-unknown-type","errorCode":null,"errorMessage":"Given channel handler is an unknown type.","messagePattern":"Given channel handler is an unknown type\\.","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php","lineNumber":167,"sourceCode":"    }\n\n    /**\n     * Extracts the parameters out of what the user passed to handle the channel authentication.\n     *\n     * @param  callable|string  $callback\n     * @return \\ReflectionParameter[]\n     *\n     * @throws \\Exception\n     */\n    protected function extractParameters($callback)\n    {\n        if (is_callable($callback)) {\n            return (new ReflectionFunction($callback))->getParameters();\n        } elseif (is_string($callback)) {\n            return $this->extractParametersFromClass($callback);\n        }\n\n        throw new Exception('Given channel handler is an unknown type.');\n    }\n\n    /**\n     * Extracts the parameters out of a class channel's \"join\" method.\n     *\n     * @param  string  $callback\n     * @return \\ReflectionParameter[]\n     *\n     * @throws \\Exception\n     */\n    protected function extractParametersFromClass($callback)\n    {\n        $reflection = new ReflectionClass($callback);\n\n        if (! $reflection->hasMethod('join')) {\n            throw new Exception('Class based channel must define a \"join\" method.');\n        }\n","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/laravel/framework/blob/bd6b5437e6ad87bb49f9b426724f07a9f64e9683/src/Illuminate/Broadcasting/Broadcasters/Broadcaster.php#L149-L185","documentation":"Thrown by Broadcaster::extractParameters() (during channel authentication) when the registered channel callback is neither a callable nor a string. Laravel channel handlers must be a Closure/callable or a class-string (for class-based channels with a join() method); any other type is rejected.","triggerScenarios":"Calling Broadcast::channel('order.{id}', $value) where $value is an integer, an array, an object that is not callable, or null; the error surfaces when a client subscribes to that channel and the broadcaster tries to authorize it.","commonSituations":"Passing an array like [ChannelClass::class, 'join'] instead of the class string; passing a variable that was never assigned; registering a channel with a non-invokable object instance.","solutions":["Pass a Closure/callable or the class-string of a class-based channel (with a join() method) to Broadcast::channel().","For class channels use OrderChannel::class (string), not new OrderChannel() unless it is invokable.","Verify the callback value is not null/int/array before registering.","Add a test that asserts is_callable($callback) || is_string($callback) for every registered channel."],"exampleFix":"// before\nBroadcast::channel('order.{id}', ['App\\Broadcasting\\OrderChannel', 'join']);\n// or\nBroadcast::channel('order.{id}', null);\n\n// after - class-based channel (string)\nBroadcast::channel('order.{id}', \\App\\Broadcasting\\OrderChannel::class);\n// or a closure\nBroadcast::channel('order.{id}', fn ($user, $id) => $user->id === Order::find($id)->user_id);","handlingStrategy":"type-guard","validationCode":"if (! is_callable($callback) && ! is_string($callback)) {\n    throw new InvalidArgumentException('Channel callback must be a callable or a class-string.');\n}\nBroadcast::channel('order.{id}', $callback);","typeGuard":"function isValidChannelHandler(mixed $callback): bool\n{\n    return is_callable($callback) || is_string($callback);\n}","tryCatchPattern":"try {\n    Broadcast::channel('order.{id}', $callback);\n} catch (\\Exception $e) {\n    if (str_contains($e->getMessage(), 'unknown type')) {\n        Broadcast::channel('order.{id}', \\App\\Broadcasting\\OrderChannel::class);\n    } else {\n        throw $e;\n    }\n}","preventionTips":["Register channels with a Closure/callable or a class-string only.","For class-based channels pass OrderChannel::class (string), not an instance unless it is invokable.","Add a boot-time test asserting every registered channel callback is callable or a string."],"tags":["broadcasting","channels","authorization","laravel"],"analyzedSha":"bd6b5437e6ad87bb49f9b426724f07a9f64e9683","analyzedAt":"2026-08-06T00:28:32.783Z","schemaVersion":2}