通过Controller索引中的URL访问参数

时间:2013-05-06 11:59:10

标签: php codeigniter

好的,我需要的东西可能听起来相当容易(或者很复杂? - 我不知道),但这里是:

在CodeIgniter中,给定一个控制器,例如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`控制器。

那么,你会怎么做呢?


P.S。

1。请允许我们避免与.htaccess有关的解决方案以及模糊的重定向,让我们坚持使用最适合CI的方法(如果有的话)。

2。不建议我创建适当的函数(而不是使用一些变量访问器) - 如果我想这样做,我已经做到了

3。参数最好应该是SEO友好的URL的一部分,而不是与$_GET等一起使用(例如mysite.com/test/?param1=someparam1&param2=someparam2)

3 个答案:

答案 0 :(得分:3)

在config / routes.php

中试试
$route['test/(:any)'] = 'test/index/$1';

答案 1 :(得分:0)

您必须像这样访问您的网站:

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

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

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

答案 2 :(得分: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 );
}