@@ -749,44 +749,37 @@ public static function findRoute(
749
749
$ uri = $ uri ?? static ::getCurrentUri ();
750
750
$ routes = $ routes ?? static ::$ routes [\Leaf \Http \Request::getMethod ()];
751
751
752
- foreach ($ routes as $ route ) {
753
- // Replace all curly braces matches {} into word patterns (like Laravel)
754
- $ route ['pattern ' ] = preg_replace ('/\/{(.*?)}/ ' , '/(.*?) ' , $ route ['pattern ' ]);
755
-
756
- // we have a match!
757
- if (preg_match_all ('#^ ' . $ route ['pattern ' ] . '$# ' , $ uri , $ matches , PREG_OFFSET_CAPTURE )) {
758
- // Rework matches to only contain the matches, not the orig string
759
- $ matches = array_slice ($ matches , 1 );
760
-
761
- // Extract the matched URL parameters (and only the parameters)
762
- $ params = array_map (function ($ match , $ index ) use ($ matches ) {
763
- // We have a following parameter: take the substring from the current param position until the next one's position (thank you PREG_OFFSET_CAPTURE)
764
- if (isset ($ matches [$ index + 1 ]) && isset ($ matches [$ index + 1 ][0 ]) && $ matches [$ index + 1 ][0 ][1 ] != -1 && is_array ($ matches [$ index + 1 ][0 ])) {
765
- return trim (substr ($ match [0 ][0 ], 0 , $ matches [$ index + 1 ][0 ][1 ] - $ match [0 ][1 ]), '/ ' );
766
- }
767
-
768
- // Temporary fix for optional parameters
769
- if (($ match [0 ][1 ] ?? 1 ) === -1 && ($ match [0 ][0 ] ?? null ) === '' ) {
770
- return ;
771
- }
772
-
773
- // We have no following parameters: return the whole lot
774
- return isset ($ match [0 ][0 ]) ? trim ($ match [0 ][0 ], '/ ' ) : null ;
775
- }, $ matches , array_keys ($ matches ));
752
+ // Preserve existing $_GET parameters
753
+ $ existingQueryParams = $ _GET ;
776
754
777
- $ paramsWithSlash = array_filter ($ params , function ($ param ) {
778
- if (!$ param ) {
779
- return false ;
780
- }
781
-
782
- return strpos ($ param , '/ ' ) !== false ;
783
- });
755
+ // Extract query string and remove it from URI
756
+ $ parsedUrl = parse_url ($ uri );
757
+ $ uriPath = $ parsedUrl ['path ' ] ?? '/ ' ;
758
+ parse_str ($ parsedUrl ['query ' ] ?? '' , $ queryParams );
784
759
785
- // if any of the params contain /, we should skip this route
786
- if (!empty ($ paramsWithSlash )) {
787
- continue ;
760
+ foreach ($ routes as $ route ) {
761
+ // Match named parameters in the pattern
762
+ preg_match_all ('/{(\w+)}/ ' , $ route ['pattern ' ], $ paramNames );
763
+ $ paramNames = $ paramNames [1 ] ?? [];
764
+
765
+ // Replace all curly braces {} with regex capture groups
766
+ $ pattern = preg_replace ('/\/{(.*?)}/ ' , '/([^\/]+) ' , $ route ['pattern ' ]);
767
+
768
+ // Match current URI against the route pattern
769
+ if (preg_match ('#^ ' . $ pattern . '$# ' , $ uriPath , $ matches )) {
770
+ array_shift ($ matches ); // Remove full match
771
+
772
+ // Extract parameter values
773
+ $ params = [];
774
+ foreach ($ matches as $ index => $ value ) {
775
+ $ paramName = $ paramNames [$ index ] ?? "var " . ($ index + 1 );
776
+ $ params [$ paramName ] = trim ($ value , '/ ' );
788
777
}
789
778
779
+ // Merge extracted route parameters with existing query parameters
780
+ $ _GET = array_merge ($ existingQueryParams , $ params );
781
+
782
+ // Return matched route info
790
783
$ routeData = [
791
784
'params ' => $ params ,
792
785
'handler ' => $ route ['handler ' ],
@@ -795,9 +788,7 @@ public static function findRoute(
795
788
796
789
$ handledRoutes [] = $ routeData ;
797
790
798
- if ($ returnFirst ) {
799
- break ;
800
- }
791
+ if ($ returnFirst ) break ;
801
792
}
802
793
}
803
794
0 commit comments