[翻译]CI从2.2升级到3.0

英文原文

从2.2 升级到3.0 更新之前先保证网站处于离线状态.

步骤 1: 更新 CI 所有文件

替换 system 目录下所有文件,然后替换index.php文件,如果之前有更新index.php,请在新的文件上做更改.

你必须先删除旧的system/目录,然后把它放到其它 的地方.直接简单的复制过去可能会导致问题.

如果您在这些文件夹中有任何自定义功能的文件,请先复制它们.

步骤 2: 更新你的类的文件名

从CI 3.0开始,所有的类文件名(库,驱动,控制器,模型)必须首字母大写的形式,必须大写字母开头. 例如:

application/libraries/mylibrary.php

需要更改成

application/libraries/Mylibrary.php

同样的有,驱动库,扩展和对CI 核心库的扩展

application/libraries/MY_email.php application/core/MY_log.php

上述文件应分别改名为以下:

application/libraries/MY_Email.php application/core/MY_Log.php

控制器:

application/controllers/welcome.php -> application/controllers/Welcome.php

模型:

application/models/misc_model.php -> application/models/Misc_model.php

请注意这并不影响目录,配置文件,视图,辅助,钩子或其它,只是作用于类 你现在必须记住一个简单规则 -类的文件名首字母大写,除此之外全部小写

步骤 3: 替换 config/mimes.php 文件

这个文件更新了更多的用户mime类型, 请复制这个文件到 应用目录下/config/mimes.php.

步骤 4: 在config/autoload.php 文件中移除 $autoload['core'] 配置选项

从CI 1.4.1开始$autoload['core'] 配置就已经过时了,现在移除了,使用$autoload['libraries']配置来替代.

步骤 5:移动你的日志类(包括重写的和扩展之类)

日志类被作为是一个“核心”类,现在位于system/core/ 目录下,因此,为了你的日志类(重写或扩展)能工作,必须移动到application/core/目录下:

application/libraries/Log.php -> application/core/Log.php 
application/libraries/MY_Log.php -> application/core/MY_Log.php
步骤 6: 更新Session 库的用法

在CI 3.0中Session库是完全重写的,并且有很多新特性,但也意味着需要作出改变...

最值得注意的地方是,该库现在使用单独的存储驱动程序,而不是始终依赖于(加密)的cookies.事实上,cookies作为存储已被删除,你必须始终使用服务器端存储引擎,默认的选项是使用文件.

Session 类现在使用PHP自身的机制构建自定义会话句柄,这也意味着,您的会话数据现在可以通过全局$_SESSION 变量来访问(虽然,我们不可能把它作为“userdata”,就像现在这样)

几个配置选项已被删除,并且也添加了几个.你应该阅读整个SESSION库手册的详细资料,下面是一个简短的列表,变化包括:

  • 设置$config['sess_driver']配置的值 默认值为file,如果有设置 $config['sess_use_database']的选项,在这种情况下它将被设置为database.
  • 设置$config['sess_save_path']配置的值 在database的驱动中,依赖 $config['sess_table_name']的配置,否则你需要阅读其它驱动详细手册.
  • 更新你的 ci_sessions 的表 (只针对'database'驱动) 表结构发生了变化,特别是: session_id 字段 改名为 id user_agent 字段删除了 user_data 字段改名为data并且在mysql下为BLOB类型 last_activity 字段改名为timestamp 这只是一小部分变化,请阅读session 数据库部分的详细手册获取更多信息

只有MySQL和PostgreSQL官方支持.其他数据库可能可以工作,但由于缺少协同锁(Advisory lock)功能,它们是不安全的并发请求,你应该考虑使用其它的驱动程序.

  • 移除 $config['sess_match_useragent'] 配置 用户user-agent字符串是用户的浏览器输入的,或者说是客户端输入.因此,它的功能意义并不大,已经被移除了.

  • 移除 $config['sess_encrypt_cookie'] 配置 正如上面所说,cookie库不在作为一个存储机制,这个选项也没有作用了.

  • 移除 $config['sess_expire_on_close'] 配置

此选项仍可以使用,但仅用于向后兼容的目的,否则应删除.通过设置$config['sess_expiration']的值为0来实现同样的效果。

  • 检查 "userdata"中与"flashdata"的冲突

flashdata现在只是普通的"userdata"的一部分,只是标记为在下一个请求时删除。换句话说,你不能有“userdata”和“flashdata”具有相同的名称,因为它是同一个内容里面。

  • 检查 session的 元数据内容(metadata)

以前,你可以访问“session_id','ip_address','user_agent'和'last_activity'元数据项目的用户数据.现在这是不可能的,如果你的应用程序依赖于这些值,你应该阅读session元数据的手册内容。

  • 检查 unset_userdata() 用法

以前,该方法接受一个关联数组的'key'=>'value' 多维数组.然而,这是没有意义的,你现在只有通过keys,作为数组的元素.

// 以前
$this->session->unset_userdata(array('item' => '', 'item2' => ''));

// 现在
$this->session->unset_userdata(array('item', 'item2'));

最后,如果你写了一个Session 扩展,必须把扩展文件放入 application/libraries/Session/ 目录下

步骤 7: 更新 config/database.php 文件

由于3.0.0 更换 Active Record 为 Query Builder,所以在config/database.php文件中,你应该把变量名$active_record更改为$query_builder:

$active_group = 'default';
// $active_record = TRUE;
$query_builder = TRUE;
步骤 8: 替换错误模板(error templates)

在CI 3.0中,错误模板被作为视图移动到应用目录/views/errors* 目录下. 此外,我们增加了命令行错误模板在普通文本格式的,不像HTML那样,适用于命令行.这当然需要一定的层次分离. 比较安全的做法是,把以前的模板从应用目录/errors* 移动到应用目录/views/errors/html*,但是,你需要从相应CI库的文件中拷贝放入应用目录/views/errors/cli* 文件目录中

步骤 9: 更新 config/routes.php 文件

#####路由规则包括 :any

一直以来,CI 在路由匹配中已经提供了通配符 :any 来匹配任意字符的的一种方式

然而,通配符 :any 其实只是一个别名为正则表达式,用于在方法执行.+,这是错误的,因为它也包括符号/(斜线)字符,这是URI段分隔符,没有意义.

在CI 3.0中,通配符 :any 讲代表 [^/]+,所以不会匹配到 / (斜线).

有许多开发人员用到了这个功能.如果你是其中的一个,想要匹配一个正斜杠,请使用.+表达式:

(.+)    //  匹配任意字符 
(:any)  //  匹配任意字符,除了'/'
目录和默认控制器(default_controller),404重写(404_override)

我们知道,$route['default_controller'] 和 $route['404_override'] 的设置 不仅可以设置为一个控制器名称,也可以设置为控制器/方法名称。然而,可能的一些用户使用 目录/控制器这种方式来使用.

正如已经说过的,这种行为是附带的,不是逾期的,也没有文档说明.如果你已经用到它了,你的应用可能影响到CI。

在3.0中的另一个显著的变化是,'default_controller'和'404_override'现在支持每个应用的目录了,下面来解释一下,看下面的例子:

$route['default_controller'] = 'main';

现在,假设你的网站是位于example.com,我们已经知道,如果一个用户访问http://example.com, 上面的设置会首先加载 'Main' 控制器.

然而,如果你有一个application/controllers/admin/ 和用户访问http://example.com/admin/ 会发生什么? 在CI 3.0中,路由会首先寻找 admin/ 目录下的'Main' 控制器为好,如果未找到,将会触发 Not Found (404)。

同样的规则也适用于 '404_override' 设置

步骤 10: 很多函数返回值为空代替之前的FALSE(在找不到参数项时)

需要方法和函数现在在找到不到参数项的时候返回FALSE代替NULL:

  • Common functions config_item() Config Class config->item() config->slash_item()
  • Input Class input->get() input->post() input->get_post() input->cookie() input->server() input->input_stream() input->get_request_header()
  • Session Class session->userdata() session->flashdata()
  • URI Class uri->segment() uri->rsegment()
  • Array Helper element() elements()
步骤 11: XSS 过滤器的用法

在CI的许多方法允许你通过一个布尔参数来决定是否使用XSS过滤器,这个参数的默认值是FALSE,但是现在改成NULL,并且是由$config['global_xss_filtering']配置的值来决定. 如果你手动改变 $xss_filter 参数的值或者$config['global_xss_filtering']的值一直设置为FALSE,那么这种用法改变不会影响到你.

否则,需要查看以下函数的用法:

//Input Library
input->get()
input->post()
input->get_post()
input->cookie()
input->server()
input->input_stream()
//Cookie Helper 
get_cookie()

另一个相关的变化是,当全局XSS过滤器打开的时候, $_GET, $_POST, $_COOKIE and $_SERVER superglobals不再自动覆盖

步骤 12: Check for potential XSS issues with URIs
步骤 12: 检查与URIs相关的潜在XSS问题

URI 库用来自动转换在URI中遇到的特殊字符为HTML转义字符. 除了在$config['permitted_uri_chars']中配置内容外,这是为了提供自动的XSS保护的,但已被证明是有问题的,在CI 3.0中被移除.

如果在你的应用中依赖这个特性,你应该通过$this->security->xss_clean()来过滤URI段的输出

步骤 13: 检查验证规则中的 xss_clean用法

大量的XSS 清理规则应该作用于输出,而不是改变输入数据. 我们在自动处理和全局XSS处理功能上犯了一些错误(参考前面XSS处理部分),所以现在努力阻止这种做法,我们从验证规则中移除了xss_clean处理的这部分功能. 因为Validation 库主要是处理输入数据,xss_clean 放在一起不合适,不属于这里. 如果你确实需要使用这个功能,你可以加载 Security 助手,里面包含xss_clean(),

步骤 14: 更新输入类的方法get_post()

以前,输入类的方法get_post()首先在POST请求中搜索数据,然后才是GET请求的数据.这种方法已被修改成先是GET,然后是POST,正如它的名字一样,然后增加了一个方法post_get(),先搜索POST,后GET,和以前get_post()的功能一样.

步骤 15: 更新 目录助手函数directory_map()

在数组结果中,目录现在以一个尾随目录分隔符结束(通常为斜线)

步骤 16: 更新数据库的 drop_table() 方法

到目前为止,drop_table() 函数默认加上了IF EXISTS,但是大多数数据库驱动是不能工作的. 在CI 3.0中,默认不会添加 IF EXISTS条件了,并且第二个参数是可选的,默认是FALSE.

如果你的应用是加上了IF EXISTS判断的话,不用做任何改变.

// 现在只是删除表'table_name'
$this->dbforge->drop_table('table_name');

// 存在表'table_name'的话便删除
$this->dbforge->drop_table('table_name', TRUE);

示例使用MySQL特定的语法,但它应该工作在除ODBC的以外所有数据库驱动.

步骤 17: 邮件库的多封邮件发送方法
发送邮件成功后会自动清除发送设置的参数,在send()方法中设置的第一参数为FALSE时,就不会清除设置的参数,如下:
if ($this->email->send(FALSE))
{
    // Parameters won't be cleared
}
步骤 18: 更新表单验证的语言方式
对于表单验证库的语言包文件和错误信息的格式有两点改进:
  • 这里是列表文本为了避免名字冲突,语言库的索引键的前缀必须为form_validation_
// 以前
$lang['rule'] = ...

// 现在
$lang['form_validation_rule'] = ...
  • 这里是列表文本错误信息的格式改为命名参数形式,比sprintf()更灵活些:
// 以前
'The %s field does not match the %s field.'

// 现在
'The {field} field does not match the {param} field.'

以前的方式还可以继续工作,但在CodeIgniter 3.1和以后的版本中,非前缀的索引键会被移除,因此应该尽早替换.

步骤 19: 删除使用过时(旧)的功能用法
除了$autoload['core']配置选项以外,在 CI 3.0.0中移除了大量功能:
SHA1库(SHA1)
以前的SHA1库被移除了,只能使用php的原生函数sha1()了.
另外 Encrypt库的sha1()方法也被移除了.
扩展名常量(The EXT constant)
自从放弃支持php4以后,一直不赞成使用扩展名常量,现在CI新版本中也不需要有不同的文件扩展名了,只使用``.php``来代替了.
表情助手(Smiley helper)
表情助手是来自EllisLab's ExpressionEngine的产品,然而对于CI的框架来说作用不大,现在也被移除了.
另外,以前废弃的函数js_insert_smiley()(从 1.7.2版本开始)现在被移除了.
加密库(The Encrypt library)
根据大量漏洞报告,加密库已经过时了.
新的加密库使用MCrypt 扩展( /dev/urandom 可用) 或者 PHP 5.3.3 版本以上和 OpenSSL扩展,这似乎不是比较方便,但是需要我们使用正确使用的加密功能

加密库一直会保持向后兼容

尽快使用新的加密库

购物车库(The Cart library)
购物车库,对于CI来说,和表情助手一样,计划在CI 3.1+版本中移除.

现在仍可使用,但是尽快移除此功能用法

数据库驱动('mysql', 'sqlite', 'mssql', 'pdo/dblib')
mysql数据库驱动使用的最老的mysql扩展,众所周知,有些许底层问题,在PHP 5.5 和CI 3.0中已经过时了,使用mysqli扩展来代替

请使用'mysqli' 或者 'pdo/mysql' 作为nysql数据库驱动,mysql 驱动会在将来版本中移除.

同一原因,sqlite, mssql 和 pdo/dblib (类似 pdo/mssql or pdo/sybase)驱动和mysql驱动一样,从php5.3版本以来就没有了.

因此,在CI 下一版本中,这些过时驱动会移除掉,应该使用sqlite3, sqlsrv or pdo/sqlsrv 更高级的驱动.

这些驱动现在还可以使用,但是强烈建议尽快使用其它的.

#####加密助手函数do_hash()

加密助手函数do_hash()只是php原生函数hash()的别名,是过时的并且计划在CI 3.1版本去掉.

这些函数现在还可以使用,但是强烈建议尽早更换

$config['global_xss_filtering']的设置
上面已经描述过,XSS 过滤处理不应该在所有数据输入的时候,因此 ```$config['global_xss_filtering']```的配置不是一个好策略,然后是过时的.

代替方法就是需要处理用户端的数据时使用```xss_clean()```函数,或者使用类似HTML Purifier那样去处理数据.

这些设置现在还可以使用,但是强烈建议尽早更换

文件助手函数read_file()
文件助手函数read_file()只是php原生函数file_get_contents()的别名,是过时的并且计划在CI 3.1版本去掉.

这些函数现在还可以使用,但是强烈建议尽早更换

字符串助手函数repeater()
字符串助手函数repeater()只是php原生函数str_repeat()的别名,是过时的并且计划在CI 3.1版本去掉.

这些函数现在还可以使用,但是强烈建议尽早更换

字符串助手函数trim_slashes()
字符串助手函数trim_slashes()只是php原生函数trim()的别名(第二个参数有变化而已),是过时的并且计划在CI 3.1+版本移除.

这些函数现在还可以使用,但是强烈建议尽早更换

表单助手函数form_prep()
字符串助手函数form_prep()只是php原生函数html_escape()的别名,是过时的并且计划在CI 3.1版本去掉.

请使用html_escape()函数替代

这些函数现在还可以使用,但是强烈建议尽早更换

邮件助手函数
邮件助手函数总只有两个函数方法

valid_email()

send_email() 两个函数的别名分别是php原生函数filter_var()mail(),因此,邮件助手是过时的,并且计划在CI 3.1+版本移除.

这些函数现在还可以使用,但是强烈建议尽早更换

数据助手函数standard_date()
数据助手函数standard_date()是过时的PHP常量,它与函数date() 提供功能是一样的,此外,名字也类似,下面如何替换的例子:
// 以前方式 
standard_date(); // 相当于 standard_date('DATE_RFC822', now());

// 替换方式
date(DATE_RFC822, now());

// 以前方式
standard_date('DATE_ATOM', $time);

// 替换方式
date(DATE_ATOM, $time);

这些函数现在还可以使用,但是强烈建议尽早更换,并且计划在CI 3.1+版本移除.

HTML助手函数nbs(), br()

数据助手函数nbs() 和 br() 只是原生函数str_repeat()加上对&nbsp; 和 <br > 字符的处理.

因为只是原生php函数的别名,没有提供功能作用,是过时的并且计划在CI 3.1+版本去掉.

这些函数现在还可以使用,但是强烈建议尽早更换

分页库'anchor_class'的设置

分页库现在支持添加任何HTML属性的锚通过attributes设置,里面已经包含了class设置,单独的anchor_class设置已经属于多余了,正因为如此,'anchor_class'的设置是过时的,并且计划在CI 3.1+版本移除.

这些函数现在还可以使用,但是强烈建议尽早更换

字符串助手函数random_string()

字符串助手函数random_string()有两个类型 'unique' 和 'encrypt'

当使用函数random_string(),两个类型分别对应 md5 和 sha1的别名,是过时的并且计划在CI 3.1+版本去掉.

这些选项现在还可以使用,但是强烈建议尽早更换

URL助手分隔符'dash' 和 'underscore'

当使用url_title()函数时,你不应该使用长横线和下划线作为单词的分隔符,这个函数接受任意字符作为分隔符,你应该用 '-' 代替'dash' 和 '_' 代替 'underscore' 参数.

dash 和 underscore 现在是作为别名,计划在CI 3.1+版本移除.

这些选项现在还可以使用,但是强烈建议尽早更换

Session 库的方法 all_userdata()

在变更日志中看到 Session 库的方法 userdata() 在没有参数的情况下返回所有的用户session数据:

$this->session->userdata();

这样的话使得all_userdata()方法是多余的,只是作为userdata()的别名而已,是过时的并且计划在CI 3.1版本去掉.

此方法现在还可以使用,但是强烈建议尽早更换

数据库添加列方法 add_column()的AFTER功能变化

如果你使用了add_column()第三个参数用来定义添加数据库列的AFTER 功能,需要改变用法. 第三个参数是过时的,计划在CI 3.1+版本去掉. 你应该把AFTER的定义放在字段的定义数组内,如下例:

// 以前:
$field = array(
    'new_field' => array('type' => 'TEXT')
);

$this->dbforge->add_column('table_name', $field, 'another_field');

// 现在:
$field = array(
    'new_field' => array('type' => 'TEXT', 'after' => 'another_field')
);

$this->dbforge->add_column('table_name', $field);

这个参数现在还可以使用,但是强烈建议尽早更换

这个参数只是MYSQL和CUBRID数据库支持,其它的数据库不支持,会自动忽略它.

URI 路由方法 fetch_directory(),fetch_class(),fetch_method()

随着CI_Router::$directory, CI_Router::$class and CI_Router::$method 变成公开属性,然后它们的方法fetch_*()只是返回它们的属性参数,没有必要保留这些功能了. 它们属于内部,未公开方法,但是为了保持向后兼容性我们需要选择改变它们,如何有使用它们,可以通过它们的属性来替代:

$this->router->directory;
$this->router->class;
$this->router->method;

这个方法现在还可以使用,但是强烈建议尽早更换

输入库方法 is_cli_request()

加载输入库之前,CI 内部很多地方需要调用CI_Input::is_cli_request()这个必要的方法,基于此,由一个公用函数is_cli()来替代它,不过只是一个别名而已.

新的方法可以在任意地方非常方便的使用

// 以前
$this->input->is_cli_request();

// 现在
is_cli();

CI_Input::is_cli_request() 现在是过时的并且计划在CI 3.1+版本去掉.

注解

这个方法现在还可以使用,但是强烈建议尽早更换

配置库(Config) 方法 system_url()

CI_Config::system_url()的用法不太恰当,也就是说,从安全的角度讲CI 的system 目录不应该是公开访问的目录

由于这个原因,这个方法是过时的并且计划在CI 3.1+版本移除.

这个方法现在还可以使用,但是强烈建议尽早更换

Javascript 库

JavaScript库一直是一个“实验”的状态,从来没有真正有用的,也没有找到一个恰当的解决办法.

现在是过时的并且计划在CI 3.1+版本去掉. 这个库现在还可以使用,但是强烈建议尽早更换

步骤 20: 检查文本助手 (Text helper)的函数highlight_phrase()用法

文本助手功能函数highlight_phrase()默认的HTML标签从<strong>更改为新的HTML5标签<mark> 除非你已经使用了自己的高亮标签,这可能会给你的浏览者带来问题,比如使用IE8.因此我们建议你将下面的代码添加到你的CSS文件,为了避免与旧的浏览器的向后兼容性:

mark {
    background: #ff0;
    color: #000;
};

转载于:https://my.oschina.net/2688/blog/628543

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值