|
31 | 31 | use CodeIgniter\HTTP\ResponsableInterface; |
32 | 32 | use CodeIgniter\HTTP\ResponseInterface; |
33 | 33 | use CodeIgniter\HTTP\URI; |
| 34 | +use CodeIgniter\Router\CallableParamClassifier; |
| 35 | +use CodeIgniter\Router\ParamKind; |
34 | 36 | use CodeIgniter\Router\RouteCollectionInterface; |
35 | 37 | use CodeIgniter\Router\Router; |
36 | 38 | use Config\App; |
@@ -727,36 +729,37 @@ private function resolveCallableParams(ReflectionFunctionAbstract $reflection, a |
727 | 729 | $routeIndex = 0; |
728 | 730 |
|
729 | 731 | foreach ($reflection->getParameters() as $param) { |
730 | | - // Inject FormRequest subclasses regardless of position. |
731 | | - $formRequestClass = FormRequest::getFormRequestClass($param); |
732 | | - |
733 | | - if ($formRequestClass !== null) { |
734 | | - $resolved[] = $this->resolveFormRequest($formRequestClass); |
735 | | - |
736 | | - continue; |
737 | | - } |
738 | | - |
739 | | - // Variadic parameter - consume all remaining route segments. |
740 | | - if ($param->isVariadic()) { |
741 | | - while (array_key_exists($routeIndex, $routeParams)) { |
742 | | - $resolved[] = $routeParams[$routeIndex++]; |
743 | | - } |
744 | | - |
745 | | - break; |
746 | | - } |
747 | | - |
748 | | - // Consume the next route segment if one is available. |
749 | | - if (array_key_exists($routeIndex, $routeParams)) { |
750 | | - $resolved[] = $routeParams[$routeIndex++]; |
751 | | - |
752 | | - continue; |
753 | | - } |
754 | | - |
755 | | - // No more route segments. Required params stop iteration so that |
756 | | - // PHP throws an ArgumentCountError on the call site. Optional |
757 | | - // params are omitted - PHP then applies their declared default value. |
758 | | - if (! $param->isOptional()) { |
759 | | - break; |
| 732 | + [$kind, $formRequestClass] = CallableParamClassifier::classify($param); |
| 733 | + |
| 734 | + switch ($kind) { |
| 735 | + case ParamKind::FormRequest: |
| 736 | + // Inject FormRequest subclasses regardless of position. |
| 737 | + $resolved[] = $this->resolveFormRequest($formRequestClass); |
| 738 | + |
| 739 | + continue 2; |
| 740 | + |
| 741 | + case ParamKind::Variadic: |
| 742 | + // Consume all remaining route segments. |
| 743 | + while (array_key_exists($routeIndex, $routeParams)) { |
| 744 | + $resolved[] = $routeParams[$routeIndex++]; |
| 745 | + } |
| 746 | + break 2; |
| 747 | + |
| 748 | + case ParamKind::Scalar: |
| 749 | + // Consume the next route segment if one is available. |
| 750 | + if (array_key_exists($routeIndex, $routeParams)) { |
| 751 | + $resolved[] = $routeParams[$routeIndex++]; |
| 752 | + |
| 753 | + continue 2; |
| 754 | + } |
| 755 | + |
| 756 | + // No more route segments. Required params stop iteration so |
| 757 | + // that PHP throws an ArgumentCountError on the call site. |
| 758 | + // Optional params are omitted - PHP then applies their |
| 759 | + // declared default value. |
| 760 | + if (! $param->isOptional()) { |
| 761 | + break 2; |
| 762 | + } |
760 | 763 | } |
761 | 764 | } |
762 | 765 |
|
|
0 commit comments