如何将 2 个参数路由到控制器?

问题描述 投票:0回答:4

这看起来很基本,但我无法掌握它。

我正在尝试向控制器中的方法发送多个参数,如下所示:

http://localhost/ci/index.php/subjects/3/state

这是我尝试过的路线:

$route['subjects/(:num)'] = 'subjects/view/$1';
$route['subjects/(:num)/{:any}'] = 'subjects/view/$1/$2';

该方法接受2个参数:

public function view($slug, $id = null){

}

但我似乎得到了 404。我怎样才能让它工作?我需要视图方法始终接受 1 个参数和可选的其他参数。

注意:我包括了 url 助手。

codeigniter codeigniter-2 codeigniter-url codeigniter-routing
4个回答
45
投票

您的路径括号有问题,只需将其从 {} 更改为 () 括号即可工作

来自

$route['subjects/(:num)/{:any}'] = 'subjects/view/$1/$2';

$route['subjects/(:num)/(:any)'] = 'subjects/view/$1/$2';

10
投票

始终维护您的路由规则

喜欢

$route['subjects/(:num)/(:any)/(:any)/(:any)'] = 'subjects/view/$1/$2/$3/$4';
$route['subjects/(:num)/(:any)/(:any)'] = 'subjects/view/$1/$2/$3';
$route['subjects/(:num)/(:any)'] = 'subjects/view/$1/$2';

始终遵循此模式进行路由

如果你这样添加

$route['subjects/(:num)/(:any)'] = 'subjects/view/$1/$2';
$route['subjects/(:num)/(:any)/(:any)/(:any)'] = 'subjects/view/$1/$2/$3/$4';
$route['subjects/(:num)/(:any)/(:any)'] = 'subjects/view/$1/$2/$3';

那么第一个条件每次都会为真。

另请参阅此链接 --> codeigniter 路由规则


3
投票

我曾经尝试过这个 URI 模式

$route['(:any)'] = 'welcome/list1/$1';
$route['(:any)/(:num)'] = 'welcome/list1/$1/$2';

$route['(:any)/(:any)'] = 'welcome/list2/$1/$2';
$route['(:any)/(:any)/(:num)'] = 'welcome/list2/$1/$2/$3';

$route['(:any)/(:any)/(:any)'] = 'welcome/list3/$1/$2/$3';

但是它不起作用......所以我用正则表达式替换它

([a-z 0-9 -]+)
已替换
(:any)
([0-9]+)
已替换
(:num)

所以就变成了

$route['([a-z 0-9 -]+)'] = 'welcome/list1/$1';
$route['([a-z 0-9 -]+)/([0-9]+)'] = 'welcome/list1/$1/$2';

$route['([a-z 0-9 -]+)/([a-z 0-9 -]+)'] = 'welcome/list2/$1/$2';
$route['([a-z 0-9 -]+)/([a-z 0-9 -]+)/([0-9]+)'] = 'welcome/list2/$1/$2/$3';

$route['([a-z 0-9 -]+)/([a-z 0-9 -]+)/([a-z 0-9 -]+)'] = 'welcome/list3/$1/$2/$3';

它对我有用:)

为了访问控制器中的变量,您可以在函数中分配任何参数。

class Welcome extends CI_Controller {

    public function list($first, $second)
    {
        var_dump($first);
        var_dump($second);
    }
}

0
投票

您可以使用

(.+)
参数传递多个段,如下所示:

$route['方法/(.+)'] = '控制器/方法/$1';

在这种情况下,$1 将包含方法/之后的所有内容。一般来说,我认为不鼓励使用它,因为您应该知道正在传递的内容并适当地处理它,但有时 (.+) 会派上用场。例如,如果您不知道传递了多少参数,这将允许您捕获所有参数。另请记住,您可以在方法中设置默认参数,如下所示:

公共函数方法($param=''){}

因此,如果没有传递任何内容,您仍然具有有效值。

您还可以像这样传递给索引方法:

$route['方法/(:任意)/(:任意)'] = '控制器/方法/索引/$1/$2';

$route['方法/(:任意)'] = '控制器/方法/索引/$1';

显然这些只是例子。您还可以包含文件夹和更复杂的路由,但这应该可以帮助您入门。

© www.soinside.com 2019 - 2024. All rights reserved.