【问题标题】:How to route 2 parameters to a controller?如何将 2 个参数路由到控制器?
【发布时间】:2012-10-26 03:01:06
【问题描述】:

这似乎很基础,但我无法掌握它。

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

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 助手。

【问题讨论】:

  • 试试这个 $route['subjects/(:num)/(:any)'] = 'subjects/view/$1/$2';会工作
  • 这有效,问题是我使用 {} 而不是 ()。谢谢提交它作为答案。

标签: codeigniter codeigniter-2 codeigniter-url codeigniter-routing


【解决方案1】:

你的路由括号有问题,只需将它从 {} 更改为 () 括号就可以了

来自

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

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

【讨论】:

  • 这样做让我陷入了无休止的刷新循环,所以我想这里出了点问题......
  • 埃里克,你还有问题吗,因为这应该适合你的情况。还有其他自定义路由吗?
  • 是的,我解决了,问题是我调用的 ajax 的 URLS 导致了无限循环,但我修复了这些问题。谢谢!
  • 如何传递多个参数进行路由?
  • 对于多个参数试试这个 $route['subjects/(:any)'] = 'subject/view';
【解决方案2】:

始终维护您的路由规则

喜欢

$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 routing rules

【讨论】:

  • 如何访问控制器中的变量?我尝试使用 ($id = null) { print_r($id); print_r($_GET);死();但两者都没有返回任何值
【解决方案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';

它对我有用:)

【讨论】:

  • 杰出解决方案
  • 谢谢。我已经使用了一段时间了,效果很好。
  • 如何访问控制器中的变量?我尝试使用 ($id = null) { print_r($id); print_r($_GET);死();但两者都没有返回任何值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2020-09-01
  • 2021-01-28
  • 2018-12-20
  • 2019-07-10
相关资源
最近更新 更多