用户
 找回密码
 入住 CI 中国社区
搜索
查看: 1306|回复: 3
收起左侧

[版本 3.x] 关于路由设置的问题

[复制链接]
发表于 2015-10-16 11:55:39 | 显示全部楼层 |阅读模式
本帖最后由 萝卜茄子 于 2015-10-16 12:13 编辑

问题叙述:        在控制器welcome下面定义了一个number(),该方法接收一个id作为其参数。
PHP复制代码
 
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Welcome extends CI_Controller{
    public function number($id)
    {
        echo $id;
    }
}
 
复制代码



        在路由文件中定义了两条规则:
PHP复制代码
 
//这是第一条
$route['welcome/([1-9]+)']  = 'welcome/$1';
//这是第二条
$route['welcome/number/([1-9]+)'] = 'welcome/number/$1';
 
复制代码

        通过测试,第一条是完全正常的。且能做到只匹配数字。
        第二条路由规则则无法限定传入的参数是数字,即便是输入的'abc'这样的非数字字符串,该方法也能接收到。
        问题是,如何做让其路由匹配且只按照设定的路由规则匹配?
        比如第二条只匹配数字。其他的就无法匹配。
        现在这么写路由的时候,第二条路由完全失效。
        求破!
        非常感谢!
——20151016
——萝卜茄子











 楼主| 发表于 2015-10-16 14:10:51 | 显示全部楼层
研究了下:
将第二条路由规则做了如下修改:
PHP复制代码
 
$route['welcome/number/(\S+)'] = function($id){
        return is_numeric($id) === TRUE ? 'welcome/number/'.$id : show_404();
};
 
 
复制代码


如此的话就可以限制传入的id是数字,且是同这个匿名函数验证后的。
这里也可以对id进行一系列的过滤,然后返回。
一个核心点是要完全匹配到该路由规则才行。所以用了\S来匹配当前id传入的任意字符,然后在该匿名函数中做相应的过滤。、
感谢大家的关注!
——20151016
——萝卜茄子
发表于 2015-10-20 12:00:31 | 显示全部楼层
本帖最后由 ci520 于 2015-10-20 12:42 编辑

学习了   刚刚接触没多长时间,还用不上,相信以后会用到的。  感谢分享{:soso_e102:}
 楼主| 发表于 2015-10-20 18:33:30 | 显示全部楼层
ci520 发表于 2015-10-20 12:00
学习了   刚刚接触没多长时间,还用不上,相信以后会用到的。  感谢分享 ...

感谢亲的关注。
ci天生不支持路由里面写太多东东。或许也还没研究透。
最后思考的结果是,最好在方法中对参数进行一系列的处理是最妥当的。
如果有什么新的进步,我们彼此分享。
——20151020
——萝卜茄子

本版积分规则