TypeRocket/typerocket

Routes matching query string

matteo-greco opened this issue · 2 comments

Hello,

I'm trying to write some redirects for an old website that had a bunch of "filename.php?id=123" URL. I tried matching them like this:

tr_route()
->get()
->noTrailingSlash()
->match( '/test/filename.php\?id=(.*)', [ 'id' ] )
->do(
	function( $id ) {
		return 'Gotcha! ' . $id;
	}
);

However, this wouldn't work. Digging through the code, I found out that the Routes class only matches on the URL path, not the full URI, so it leaves out the query string. So I made the following change

# typerocket\vendor\typerocket\core\src\Http\Routes.php
public function detectRoute()
{
    // $path = self::$request->getPath();
    $path = self::$request->getUri();
    ...

And now my route matches as I was hoping.

Is there a reason why this isn't the standard behavior of the framework? Does my change risk breaking anything?

Hey @matteo-greco

What you are doing shouldn't break anything. I may add this into core as an option to enable.

Hey @matteo-greco

I'm adding a filter to help with your use case.

# typerocket\vendor\typerocket\core\src\Http\Routes.php
public function detectRoute()
{
    ....
    $requestPath = apply_filters('tr_routes_path', $requestPath );