Open bgeneto opened 2 weeks ago
Using the (:any)
placeholder in the route does not mean that the parameter value is optional. You must always put a value.
You can use: url_to('urlto', '')
, although in general I don't think it will behave as you expect - the route will not be found.
In any case, this is not a bug.
I've been trying to use regex in routes for a long time. It failed. Try to create several routes to get rid of the "?".
$routes->get('/test/(:any)', 'Test::direct/$1', ['as' => 'test_ext']);
$routes->get('/test', 'Test::direct/$1', ['as' => 'test']);
To work, you need to specify a string for :any and not an array
url_to('urlto', 'param1/param2/param3')
not url_to('urlto', 'param1', 'param2', 'param3')
Using the
(:any)
placeholder in the route does not mean that the parameter value is optional. You must always put a value.You can use:
url_to('urlto', '')
, although in general I don't think it will behave as you expect - the route will not be found.In any case, this is not a bug.
I couldn't disagree more... Because I'm using regular expressions (note the ? char) with (:any). And it also fails for '(/(.+))?' as mentioned in this carefully written bug report.
And, by running the examples, one can see that routing mechanism is working flawlessly with or without arguments. Problem arises when using url_to. For me this is, at least, a framework inconsistency or missing feature (if not a bug). 😥
I've been trying to use regex in routes for a long time. It failed. Try to create several routes to get rid of the "?".
$routes->get('/test/(:any)', 'Test::direct/$1', ['as' => 'test_ext']); $routes->get('/test', 'Test::direct/$1', ['as' => 'test']);
To work, you need to specify a string for :any and not an array
url_to('urlto', 'param1/param2/param3')
noturl_to('urlto', 'param1', 'param2', 'param3')
Yeah! Unfortunately every time this subject comes up it is treated as a feature, read the docs etc....
So I kindly suggest to remove the partial regex support from routes (a great loss since routing works fine with regex, only additional framework related functions like url_to
or route_to
do not support it).
We could also explicitly says in the docs not to use the special '?' char in routes because of missing support.
As I carefully showed in this bug report examples, regex with '?' works with or without arguments. Problem is framework support from related helper functions.
PHP Version
8.3
CodeIgniter4 Version
CodeIgniter 4.5.5
CodeIgniter4 Installation Method
Composer (using
codeigniter4/appstarter
)Which operating systems have you tested for this bug?
Debian 12
Which server did you use?
fpm-fcgi
Database
N/A
What happened?
The following route definition works fine as long as you don't use
url_to
orroute_to
to refer to it:Linking as below works:
But using both
url_to
orroute_to
fails:Steps to Reproduce
Routes.php
:Test
controller:namespace App\Controllers;
class Test extends BaseController { public function direct(...$params): string { return view('test', ['params' => $params]); }
}
B) view using
url_to
Expected Output
No
InvalidArgumentException
,Missing argument for "(/(:any)" in route "test_urlto(/(:any))?"
while using bothurl_to
androute_to
.Anything else?
One can try it with
public bool $multipleSegmentsOneParam = true;
orpublic bool $multipleSegmentsOneParam = false;
inRouting.php
. The error is the same in both situations (just the parameters are treated differently, as expected).One can also use a regex like
'(/(.+))?'
instead of(/(:any))?
. The error remains.