不带/index/实现给控制器的index()传参数?(我的方法+问题)
以CMS做例子吧,先不说实现合不合理,假定我的控制器是Category那么列出分类的理想URI应该是:http://localhost/category/categoryname
但是很显然根据CI的URI格式,categoryname那里是函数名的地方
也就是说想让categoryname变成参数,我必须http://localhost/category/index/categoryname
我希望在控制器没有对应函数的时候,categoryname能作为index()函数的一个参数传入,实现缩掉index
我用URI路由实现的方法如下:
class Category extends Controller
{
function _remap($method)
{
if (method_exists($this, $method))
{$this->$method();}
else
{$this->index($method);}
}
function index($category='') //必须带默认值
{
... ...
}
... ...
我现在弄不清楚的问题是:
1. 我希望对整个程序中所有的控制器都应用这个路由规则该怎么做?(一个一个插当然不科学)
2. 如果URL中有多个参数会怎么样?
3. 会因为特殊字符造成安全性问题吗? 理论上 MY_Controller 可以解决楼主的问题,但我没试过 _remap 方法。 配置个uri路由
$route['category/(:any)'] = 'category/index/$1'; 本帖最后由 ares333 于 2010-12-9 17:32 编辑
MY_Controller应该可以,不过还有更好的方法,只不过要对正则有一定了解才好.给你一个终极解决方法,绝对强悍
http://codehere.net/codeigniter-url.html 学习了,呵呵 CI正常的URL应该是http://www.xxx.com/index.php/kongzhiqi/index/canshu
直接用.htaccess 将中间的 index.php/kongzhiqi/index 省略掉,直接变成 http://ww.xxx.com/canshu。我是这样做的。 ici 发表于 2010-7-27 08:35 static/image/common/back.gif
配置个uri路由
$route['category/(:any)'] = 'category/index/$1';
强烈同意,最方便的一种方法。 //我这么写,就可以随便多少参数
public function _remap($method, $params = array()){
if (method_exists($this, $method)){
return call_user_func_array(array($this, $method), $params);
}else{
//如果没有方法,则把$method压入第一个参数
$arr1stParam = array($method);
$params = array_merge($arr1stParam,$params);
call_user_func_array(array($this, 'index'), $params);
}
} ici 发表于 2010-7-27 08:35 static/image/common/back.gif
配置个uri路由
$route['category/(:any)'] = 'category/index/$1';
赞,我就是这么搞得~
把8楼的代码直接复制到/system/core/Controller.php类中即可,已测试.
页:
[1]