2
2
3
3
namespace Illuminate \Broadcasting \Broadcasters ;
4
4
5
+ use Exception ;
6
+ use ReflectionClass ;
5
7
use ReflectionFunction ;
6
8
use Illuminate \Support \Str ;
7
9
use Illuminate \Container \Container ;
@@ -56,6 +58,7 @@ protected function verifyUserCanAccessChannel($request, $channel)
56
58
}
57
59
58
60
$ parameters = $ this ->extractAuthParameters ($ pattern , $ channel , $ callback );
61
+
59
62
$ handler = $ this ->normalizeChannelHandlerToCallable ($ callback );
60
63
61
64
if ($ result = $ handler ($ request ->user (), ...$ parameters )) {
@@ -71,7 +74,7 @@ protected function verifyUserCanAccessChannel($request, $channel)
71
74
*
72
75
* @param string $pattern
73
76
* @param string $channel
74
- * @param callable $callback
77
+ * @param callable|string $callback
75
78
* @return array
76
79
*/
77
80
protected function extractAuthParameters ($ pattern , $ channel , $ callback )
@@ -88,23 +91,37 @@ protected function extractAuthParameters($pattern, $channel, $callback)
88
91
/**
89
92
* Extracts the parameters out of what the user passed to handle the channel authentication.
90
93
*
91
- * @param callable|string $callback
94
+ * @param callable|string $callback
92
95
* @return \ReflectionParameter[]
93
96
* @throws \Exception
94
97
*/
95
98
protected function extractParameters ($ callback )
96
99
{
97
100
if (is_callable ($ callback )) {
98
101
return (new ReflectionFunction ($ callback ))->getParameters ();
102
+ } elseif (is_string ($ callback )) {
103
+ return $ this ->extractParametersFromClass ($ callback );
99
104
}
100
105
101
- if (is_string ($ callback )) {
102
- return (new \ReflectionClass ($ callback ))
103
- ->getMethod ('join ' )
104
- ->getParameters ();
106
+ throw new Exception ('Given channel handler is an unknown type. ' );
107
+ }
108
+
109
+ /**
110
+ * Extracts the parameters out of a class channel's "join" method.
111
+ *
112
+ * @param string $callback
113
+ * @return \ReflectionParameter[]
114
+ * @throws \Exception
115
+ */
116
+ protected function extractParametersFromClass ($ callback )
117
+ {
118
+ $ reflection = new ReflectionClass ($ callback );
119
+
120
+ if (! $ reflection ->hasMethod ('join ' )) {
121
+ throw new Exception ('Class based channel must define a "join" method. ' );
105
122
}
106
123
107
- throw new \ Exception ( ' Unknown channel handler type. ' );
124
+ return $ reflection -> getMethod ( ' join ' )-> getParameters ( );
108
125
}
109
126
110
127
/**
@@ -226,17 +243,17 @@ protected function binder()
226
243
}
227
244
228
245
/**
229
- * @param $callback
246
+ * Normalize the given callback into a callable.
247
+ *
248
+ * @param mixed $callback
230
249
* @return callable|\Closure
231
250
*/
232
251
protected function normalizeChannelHandlerToCallable ($ callback )
233
252
{
234
- return is_callable ($ callback )
235
- ? $ callback
236
- : function (...$ args ) use ($ callback ) {
237
- return Container::getInstance ()
238
- ->make ($ callback )
239
- ->join (...$ args );
240
- };
253
+ return is_callable ($ callback ) ? $ callback : function (...$ args ) use ($ callback ) {
254
+ return Container::getInstance ()
255
+ ->make ($ callback )
256
+ ->join (...$ args );
257
+ };
241
258
}
242
259
}
0 commit comments