CodeIgniter框架的一些特性引起的人为“bug”

    公司有个项目用的是CI框架,以前没有接触过,在开发的时候因不知道其某些特性而导致出现一些人为bug,现总结如下(以下情况均是在cli模式下):

1、当一个控制器中的action与其类名一样时,那么在执行该脚本的时候,CI框架会默认执行一次与类名同名的action。

2、当控制器中有一个action名字与其类名一样时,如果在该action中使用$this->load加载一些类库、模型时会提示load未定义。

3、在使用CI框架的cli模式时,一般都是用于跑脚本。我们会在入口文件的同级目录下这么调用:php index.php [控制器上级目录名] 控制器 action [params]。

    这里的params在输入的时候都是输入数字类型的或者是字符串类型的,那么如果我们要输入数组类型的,那该如何输入呢?

如上图,crontab是目录,schoolRefreshAll是action。action有一个参数,当输入1 2 时打印出来的结果就是1了。输入1,2或者"1,2"时,可以看到,报错了。如果想输入数组该如何实现呢?通过查看CI源码终于找到答案。

因为CI框架对FAST-CGI模式与CLI模式都是一种方式处理,通过is_cli()函数进行区分后再分别处理的。

①查看system/core/URI.php文件,在其构造函数里面看到在cli模式下面,调用了_parse_argv()方法,这个方法获取了cli模式下输入的参数,在去掉脚本名的参数后将剩余的参数以"/"符号拼接成了一个字符串。

②接着走到了_set_uri_string()方法,这个方法又将上面第一步得到的urI以“/”分割后分别过滤,调用的是filter_uri()方法,在这个方法中一眼就看到了上图报错的提示信息。仔细看这个方法,在判断了uri这个变量是否为空后还判断了一个变量:$this->_permitted_uri_chars。

③发现$this->_permitted_uri_chars这个变量是读取config.php文件中的permitted_uri_chars选项。在filter_uri()方法中知道,后面进行了一次正则匹配,如果输入的uri不符合permitted_uri_chars选项中配置的规则时就会报‘The URI you submitted has disallowed characters.’的错误。

④查看application/config/config.php文件,找到permitted_uri_chars选项,发现其值为a-z 0-9~%.:_\-。看到这个我们就知道该规则支持~、%、.、:、_、\、-等符号,那么我们可以这么输入了:

php index.php crontab daguanItem schoolRefreshAll '1:2'

没有加引号的,会自动转换成字符串,除了'1\2'得到‘12’外,其余均可得到原样字符串。我们再根据某一符号进行分割,即可实现输入类似数组的值的功能了。

另外,符合规则的字符还可以一起使用的,比如'1:2_2:2';

4、在控制器中使用构造函数的时候,如果该控制器中action有使用$this->load->xxx时,会提示,‘call to a member function xxx on null’。解决方式就是尽量别使用构造函数,避免不必要的麻烦。

转载于:https://my.oschina.net/u/3017052/blog/854419

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值