0

好的,我需要的可能听起来很简单(或复杂?-我不知道),但它是:

在 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` 控制器。

那么,你会怎么做呢?


附言

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

2. 不要建议我创建适当的函数(而不是使用一些变量访问器)——如果我想这样做,我早就这样做了

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

4

3 回答 3

3

try this in config/routes.php

$route['test/(:any)'] = 'test/index/$1';
于 2013-05-06T12:09:02.257 回答
0

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

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

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

$route['test/(.*)/(.*)'] = 'test/index/$1/$2';
于 2013-05-06T12:04:02.290 回答
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 );
}
于 2013-05-06T12:11:55.610 回答