原文:http://www.yiiframework.com/news/
主翻译:@qiansen1386(东方孤思子) 校对: 时间:2014年9月29

Yii 2.0 RC 发布啦!

我们非常高兴地宣布:Yii 2.0 RC 版(发行候选版本)终于发布了!你可以参照 yiiframework.com 页面的说明来安装或升级。

该 RC 发布包含约 100 项左右的 bug 修复,以及 200 个新功能及改进。它包含了自 Beta 版 至今 5 个月来集中开发的成果。在这个过程中,我们收到了来自 Yii 社区的大量帮助。特此感谢 为 Yii 做出贡献的所有人,感谢你们让这次发布成为现实,你们是最棒的!

常见问题

  • 2.0 RC 意味着什么? RC 是发行候选版本的意思。它是在 GA (General Availability,正式发布的版本)前,最后一个开发发布。GA 前的工作,主要是少量反馈问题的修复,以及改善文档。

  • 2.0 GA 什么时候发布? 这取决于我们从 RC 发布后所收集的问题反馈。我们有一个暂定的计划是,如果 RC 版本最终被证明足够稳定,则将会在大约两周左右发布 2.0 GA。

  • 我能在我的项目里使用 RC 么? 不仅能,而且我们非常推荐你在你的新项目中试用它,并给我们你的使用反馈。不过,因为 2.0 GA 近在眼前了,所以我们建议你不要在已有的生产环境中使用它。因为我们无法确定是否会有新的不兼容修改出现,尽管这个可能性非常小。

  • 2.0 有什么文档么? 当然,我们有 官方指南 ,它包含与 Yii 2.0 相关的综合而且有深度的各种教程。还有 API 文档它是用来查阅框架中某个类库的具体用法 (译者注:也要关注我们的文档中文化项目呦!)

  • 怎么把我的项目从 1.1 升级到 2.0? 请参考 从 1.1 升级 这篇文章。 请注意,因为 2.0 相较于 1.1 是完全重构的,所以这种升级所需的改动不会太小。若你的 1.1 应用正在稳定运行,我们建议你继续使用 1.1,除非你有足够的时间和资源进行这种升级。

  • 我怎么从2.0 alpha 或 beta 升级过来 请参考 UPGRADE 的说明。

  • 我怎样了解2.0开发的最新动态? Yii 2.0 的开发活动都在 GitHub 上: https://github.com/yiisoft/yii2。 你可以关注(watch)或标星(star)这个项目来接收开发动态。你也可以订阅我们的 Twitter 更新 https://twitter.com/yiiframework(译者注:前提是你会翻墙有梯子) 或加入我们的 Facebook 小组

Yii 2.0 RC 的主要改动

此次发布,包含了很多有用的更新和改动。而在下文中我们只会总结其中最重要的几个。你可以在更新日志(CHANGELOG)查看完整的改动列表。 如果想要了解你能用 Yii 2.0 干什么,请阅读 权威指南

安全

一些安全专家,包括 Tom Worster(汤姆·沃斯特) 以及 Anthony Ferrara(安东尼·法拉利),已经帮助我们在安全方面审查了 Yii 的代码,并提供给我们了一些重要的反馈,告诉我们如何综合提升 Yii 的安全性。Tom 甚至帮助我们重写了一些安全代码,结果是更牛逼的密钥的生成与加密实现,提供了对时序攻击的保护,以及很多其他的黑科技。

为了更好地支持对一些安全功能的自定义,我们已经把之前的 Security 助手类,改为了 security 应用组件。因此,你可以用这样的 Yii::$app->security->encrypt() 的代码访问安全相关的功能。

我们也做了一些其他小一点的重要改动,来进一步提升 Yii 的安全性。比如,所有 cookies 的 httpOnly 现在是默认打开的;CSRF 令牌,现在可以存到 sessions 而不是 cookies 中,如果你设置 yii\web\Request::enableCsrfCookie 为 false。

数据库

数据库复制(主从分离)与读写分离

Yii 现在提供内建的数据库复制与读写分离的支持。有了数据库复制,数据会从一个所谓的主服务器复制到从服务器。所有的写入与更新都会发生在主服务器,而读取的操作会发生在从服务器。要使用这个功能,只需简单地配置你的数据连接为一下形式:

  1. [
  2. 'class' => 'yii\db\Connection',
  3. // 主服务器的配置
  4. 'dsn' => '主服务器的 dsn',
  5. 'username' => 'master',
  6. 'password' => '***',
  7. // 从服务器的通用配置
  8. 'slaveConfig' => [
  9. 'username' => 'slave',
  10. 'password' => '***',
  11. ],
  12. // 从服务器配置列表
  13. 'slaves' => [
  14. ['dsn' => '从服务器 1 的 dsn'],
  15. ['dsn' => '从服务器 2 的 dsn'],
  16. ['dsn' => '从服务器 3 的 dsn'],
  17. ],
  18. ]

有了这些配置,你可以照常像以前一样写 DB 查询。只要查询是从数据库中提取数据,其中一个从数据库会自动执行这个查询(一个简单的负载均衡算法会用于确定从服务器的选择);如果查询是更新或插入数据,则会使用主服务器。

事务

这里有很多有关数据库事务的改进。

首先,你可以用一种回调函数的风格来使用事务,像这样:

  1. $connection->transaction(function() {
  2. $order = new Order($customer);
  3. $order->save();
  4. $order->addItems($items);
  5. });

它等效于下面这段更长的代码:

  1. $transaction = $connection->beginTransaction();
  2. try {
  3. $order = new Order($customer);
  4. $order->save();
  5. $order->addItems($items);
  6. $transaction->commit();
  7. } catch (\Exception $e) {
  8. $transaction->rollBack();
  9. throw $e;
  10. }

其次,事务会触发几条事件。比如,开始新事务时 DB connecton 组件会触发 beginTransaction 事件;当事务成功提交时会触发 commitTransaction。当使用事务时,你就可以响应这些事件,来进行一些预处理或后加工的任务。

最后,你可以在开始一个新事务时,设置事务隔离级别(比如,READ COMMITTED)。比如,

  1. $transaction = $connection->beginTransaction(Transaction::READ_COMMITTED);

构建查询条件

当你构建一个查询条件的时候,你可以使用任意操作符。在下面的例子里,操作符 >= 被用来构建一个查询条件 age >= 30。Yii 会正确地引用字段名,并用参数绑定功能来处理值。

  1. $query = new \yii\db\Query;
  2. $query->where(['>=', 'age', 30]);

当构建 innot 条件时,你可以使用子查询,像这样:

  1. $subquery = (new \yii\db\Query)
  2. ->select('id')
  3. ->from('user')
  4. ->where(['>=', 'age', 30]);
  5. // 读取所有由 30 岁以上的客户下达的订单
  6. $orders = (new \yii\db\Query)
  7. ->from('order')
  8. ->where(['in', 'customer_id', $subquery])
  9. ->all();

前端资源管理

Yii 支持使用 BowerNPM 的包。它使用牛逼的 Composer Asset Plugin(Composer 前端资源管理插件) 来通过 Composer 的接口管理 Bower/NPM 包(如,jQuery,jQuery UI,Bootstrap 等)的依赖关系。

因为这个改变,他现在需要你先给 Composer 安装这个插件。你可以通过(在你开始安装或升级 Yii 2.0 RC 之前)运行一下指令实现(一劳永逸):

  1. php composer.phar global require "fxp/composer-asset-plugin:1.0.0-beta2"

现在如果你运行这个指令,你就可以安装 jQuery Bower 包到 vendor 目录:

  1. php composer.phar require bower-asset/jquery:2.1.*

请参考 与 Asset 有关的权威指南 综合了解关于前端资源管理的更多细节。

格式化数据

我们深度重构了数据格式化类,并且之前的 yii\base\Formatteryii\i18n\Formatter 重构为了一个 yii\i18n\Formatter 类。新的 Formatter 类提供了一个统一的接口,而与是否开启 PHP intl 扩展无关。如果扩展没有安装,他会很好地回滚为不进行国际化的数据格式化。

我们也统一了指定日期与时间格式的方式,通过 ICU 格式。诸如 DateValidator 以及 JUI 的 DatePicker 等类都默认使用该格式。然而,你依旧可以使用 PHP 日期格式,只要添加 php: 前缀。比如,

  1. $formatter = Yii::$app->formatter;
  2. $value = time();
  3. echo $formatter->asDate($value, 'MM/dd/yyyy'); // 等效于 date('m/d/Y', $value)
  4. echo $formatter->asDate($value, 'php:Y/m/d'); // 等效于 date('Y/m/d', $value)
  5. echo $formatter->asDate($value, 'long'); // 等效于 date('F j, Y', $value)

表单

ActiveForm 的 JavaScript 代码进行了一系列的改进。

区别于之前在客户端验证过程中使用回调函数注入代码的过程,现在改为触发一系列的事件。你可以更容易地编写响应这些事件的 JS 代码。比如,

  1. $('#myform').on('beforeValidate', function (event, messages, deferreds) {
  2. // 当提交按钮被点击后,在验证整张表单之前被调用
  3. // 你可以在此进行一些自定义的验证过程
  4. });
  5. $('#myform').on('beforeSubmit', function () {
  6. // 在所有验证都通过后,且表单应该被提交时调用
  7. // 你可以在此处执行 AJAX 的表单提交。请确保你返回 false 以阻止传统的表单提交过程继续执行。
  8. });

延时验证(Deferred validation)也被支持了。在上面的例子中,beforeValidate 事件里的 deferreds 参数允许你添加新的 Deferred 对象。通过对延时验证的支持,FileValidatorImageValidator (文件与图片验证器)现在也支持客户端验证功能了。

ActiveForm 的 JavaScript 代码中的很多方法现在已经暴露出来,这样你可以更加容易的在客户端环境中构建动态表单,并支持对动态生成的输入控件执行验证。比如,以下 JS 代码可用于给新创建的 “address” 输入框添加验证功能:

  1. $('#myform').yiiActiveForm('add', {
  2. 'id': 'address',
  3. 'name': 'address',
  4. 'container': '.field-address',
  5. 'input': '#address',
  6. 'error': '.field-address .help-block'
  7. });

日志 及 错误处理

现在,你可以使用数组对象作为日志消息了。默认的日志目标会自动把它们转换为文本显示;而你自定义的日志目标可以更加特殊化地处理这些复杂数据。

InvalidCallException,InvalidParamException,UnknownMethodException 现在继承自 SPL(标准 PHP 类库)的 BadMethodCallException 以使异常的层级结构更符合逻辑。

异常的显示也进行了改进,新添了对堆栈跟踪方法类中参数的显示。(保留原文:Exception display is improved by showing the arguments in the stack trace method class.求校对人员帮忙改进)

开发工具

Yii 的调试器(Debugger)对于显示当前 Yii 应用运行时的调试信息而言是很有用的工具、我们添加了一个新的调试面板以展示当前加载的前端资源包,及它们的内容。

Yii 的代码生成器 Gii 现在可以使用命令行指令调用了!之前,它只提供一个 Web 图形界面,同样非常直观且好用,但它不受一些“睾丸(高端玩家/硬核玩家)”的喜爱。现在应该每个人都开心了。更重要的是,你依旧可以照常创建自定义的 Gii 生成器,而且他可以同时在 Web 和命令行模式中调用,而无需其他任何额外的修改。

要在命令行模式中试用 Gii,只需执行以下命令:

  1. # 更改当前路径为你应用的基目录
  2. cd path/to/AppBasePath
  3. # 显示 Gii 的帮助信息
  4. yii help gii
  5. # 显示 Gii 中的模型生成器的帮助信息
  6. yii help gii/model
  7. # 根据 city 表生成 City 模型
  8. yii gii/model --tableName=city --modelClass=City

行为(Behaviors)

我们添加了一个新的行为 yii\behaviors\SluggableBehavior,它可以用直译并调整过的数据填充模型特性,比如说可用于直译 URLs。你可以这样使用它:

  1. use yii\behaviors\SluggableBehavior;
  2. public function behaviors()
  3. {
  4. return [
  5. [
  6. 'class' => SluggableBehavior::className(),
  7. 'attribute' => 'title',
  8. // 'slugAttribute' => 'alias', // 存储 slug 到 "alias" 字段
  9. // 'ensureUnique' => true, // 确保生成不重复的 slugs
  10. ],
  11. ];
  12. }

行为现在可以匿名定义并配属,比如,

  1. $component->attachBehaviors([
  2. 'myBehavior1' => new MyBehavior, // 命名的行为
  3. MyBehavior::className(), // 匿名的行为
  4. ]);

模版引擎

Smarty 和 Twig 的视图渲染器都得到了显著的提升。针对许多 Yii 的概念引入了许多特殊语法,并且我们已经收到了反馈,这些新的语法可以帮助开发者像使用普通 PHP 模版一样高效地操作 Smarty 与 Twig。要了解更多,请查阅 权威指南