2013-05-06 70 views
0

OK,我需要什么听起来可能很容易 - ,但在这里它是(或复杂的,我不知道吗?):参数控制器的指数

CI中,给定一个控制器例如test你可以这样做:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class test extends CI_Controller { 

    public function sub($param1="", $param2="") 
    { 

    } 
} 
?> 

,这意味着你可以访问之一:

  • mysite.com/test/sub
  • mysite.com/test/sub/someparam1
  • mysite的。 com/test/sub/someparam1/someparam2

但是,如果我想“省略”sub部分会发生什么?

好吧,所以我想在控制器的index功能中做同样的事情。像:

public function index($param1="", $param2="") 
{ 
} 

这样我就可以直接访问或者:

  • mysite.com/test
  • mysite.com/test/someparam1
  • mysite.com/test/someparam1/someparam2

然而,由于CI的内部设计,当我尝试这一点,它一直在寻找一个someparam1' method in the test`控制器whic h显然不存在。

那么,你会怎么做呢?


P.S.

1.请让我们避免与.htaccess和晦涩重定向做的解决方案,让我们坚持提供最CI友好的方式(如果有的话)。

2.不建议我创建适当的功能(而不是使用一些变量访问) - 如果我想去做这样,我就已经做到了

3.参数最好是一个搜索引擎友好的URL的一部分,而不是把他们与$_GET等(如mysite.com/test/?param1=someparam1 &参数2 = someparam2)

回答

3

尝试这种在配置/ routes.php文件

$route['test/(:any)'] = 'test/index/$1'; 
+0

这么简单。非常感谢,哥们!有用! :-) – 2013-05-06 12:10:04

+0

很高兴能有所帮助:) – Subash 2013-05-06 12:13:10

0

您有权访问你的网站,如这个:

  • mysite.com/test/index
  • mysite.com/test/index/someparam1
  • mysite的。COM /测试/索引/ someparam1/someparam2

或者你可以在routes.php文件文件重写

$route['test/(.*)/(.*)'] = 'test/index/$1/$2'; 
+0

那么,那么如何消除'index'部分呢? (如果'index'是存在的,那么我就不管了,如果它是别的东西。关键是有控制的名字和潜在PARAMS之间没有任何东西......) – 2013-05-06 12:06:37

+0

那么你可以使用我的另一种方法去做用routes.php文件重写。 – 2013-05-06 12:08:08

+0

只是想你额外的编辑和 - 尽管它肯定看起来接近 - 它仍然无法正常工作...... – 2013-05-06 12:09:08

0

你可以使用一些路由配置:

//if arguments start by a number 
$route['test/(^[0-9].+)'] = 'test/index/$1'; 

//if argument start by a set of choice 
$route['test/(str1|str2|str3)(:any)'] = 'test/index/$1$2'; 
//this can prevent from name collision between methods and first argument 

或者,在你的控制器使用魔术方法:

如果该控制器不匹配的URI的任何方法,这个方法会被调用。

public function __call($name, $args) { 
    call_user_func_array(array($this, 'index'), $args); 
}