公司有个项目用的是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’。解决方式就是尽量别使用构造函数,避免不必要的麻烦。