- Notifications
You must be signed in to change notification settings - Fork 2k
Open
Description
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 or route_to to refer to it:
$routes->get('/test(/(:any))?', 'Test::direct/$1', ['as' => 'test']);Linking as below works:
<a href="/test">No parameter</a> <a href="/test/param1">1 parameter</a> <a href="/test/param1/param2">2 parameters</a>But using both url_to or route_to fails:
<a href="<?= url_to('test') ?>">No parameter</a> <a href="<?= url_to('test', 'param1') ?>">1 parameter</a> <a href="<?= url_to('test', 'param1', 'param2') ?>">2 parameters</a>Steps to Reproduce
- Add the new routes in
Routes.php:
$routes->get('/test(/(:any))?', 'Test::direct/$1', ['as' => 'test']); $routes->get('/test_urlto(/(:any))?', 'Test::urlto/$1', ['as' => 'urlto']); $routes->get('/test_routeto(/(:any))?', 'Test::routeto/$1', ['as' => 'routeto']);- Create the
Testcontroller:
<?php namespace App\Controllers; class Test extends BaseController { public function direct(...$params): string { return view('test', ['params' => $params]); } public function urlto(...$params): string { return view('test_urlto', ['params' => $params]); } public function routeto(...$params): string { return view('test_routeto', ['params' => $params]); } }- Create the respective views:
A) direct view
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <h1>Testing CI4 Routing with Parameters</h1> <h2>Test using string directly</h2> <ul> <li> <a href="/test">No parameter</a> </li> <li> <a href="/test/param1">1 parameter</a> </li> <li> <a href="/test/param1/param2">2 parameters</a> </li> <li> <a href="/test/param1/param2/param3">3 parameters</a> </li> </ul> <h3>Passed Parameters</h3> <ul> <?php foreach ($params as $param) : ?> <li><?= $param ?></li> <?php endforeach; ?> </body> </html>B) view using url_to
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <h1>Testing CI4 Routing with Parameters</h1> <h2>Test using <code>url_to</code></h2> <ul> <li> <a href="<?= url_to('urlto') ?>">No parameter</a> </li> <li> <a href="<?= url_to('urlto', 'param1') ?>">1 parameter</a> </li> <li> <a href="<?= url_to('urlto', 'param1', 'param2') ?>">2 parameters</a> </li> <li> <a href="<?= url_to('urlto', 'param1', 'param2', 'param3') ?>">3 parameters</a> </li> </ul> <h3>Passed Parameters</h3> <ul> <?php foreach ($params as $param) : ?> <li><?= $param ?></li> <?php endforeach; ?> </body> </html>- Access those views at: /test and /test_urlto
Expected Output
No InvalidArgumentException, Missing argument for "(/(:any)" in route "test_urlto(/(:any))?" while using both url_to and route_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.
Metadata
Metadata
Assignees
Labels
No labels