|
1 | 1 | <?php |
2 | 2 |
|
| 3 | +/** |
| 4 | + * HelperRoute - A supporting routing class WebbyPHP Route |
| 5 | + * |
| 6 | + * This class enhances routing |
| 7 | + * entirely and handles requests directly |
| 8 | + * |
| 9 | + * Built for serving simple views and JSON responses |
| 10 | + * |
| 11 | + */ |
| 12 | + |
3 | 13 | namespace Base\Route; |
4 | 14 |
|
5 | 15 | use ArgumentCountError; |
6 | 16 | use Closure; |
| 17 | +use ReflectionFunction; |
7 | 18 |
|
8 | 19 | class HelperRoute |
9 | 20 | { |
@@ -290,13 +301,25 @@ protected static function handleJson($data, $status, $params) |
290 | 301 | * @param Closure $callback The callback |
291 | 302 | * @param array $params Route parameters |
292 | 303 | */ |
293 | | - protected static function handleClosure($callback, $params) |
| 304 | + protected static function handleClosure($callback, $params = []) |
294 | 305 | { |
295 | | - if (empty($params)) { |
296 | | - throw new ArgumentCountError('Route::page or Route::json expects at least 1 parameter to be passed. E.g Route::page("uri/(:num)")'); |
| 306 | + if (! $callback instanceof Closure) { |
| 307 | + return call_user_func_array($callback, $params); |
| 308 | + } |
| 309 | + |
| 310 | + $reference = new ReflectionFunction($callback); |
| 311 | + $provided = count($params); |
| 312 | + $required = $reference->getNumberOfRequiredParameters(); |
| 313 | + |
| 314 | + if ($required > $provided) { |
| 315 | + throw new ArgumentCountError( |
| 316 | + "Route::page(...) or Route::json(...) closure expects at least $required parameter(s), " . |
| 317 | + "but only $provided value(s) were passed from the URL. " . |
| 318 | + "Add more segments like {id} or (:num) to your route." |
| 319 | + ); |
297 | 320 | } |
298 | 321 |
|
299 | | - call_user_func_array($callback, $params); |
| 322 | + return call_user_func_array($callback, $params); |
300 | 323 | } |
301 | 324 |
|
302 | 325 | /** |
|
0 commit comments