一直都在用yii1.1,也写过几个小项目,然后现在2.0出来了,懒得看文档重新学就直接用2.0照着别人写,最后还是写不下去了,想来从头好好看yii2.0。写这篇也算是笔记吧。
说说几个较大的改动点:
1. php 5.4的一些新特性都用上,包括命名空间,数组短语法等等。
2. 路径别名扩大至文件/目录路径和 URL,路径别名必须以 @ 符号开头,@yii 就是指向 Yii 安装目录的别名,Zend Framework,你只需定义一个名为 @Zend 的路径别名指向该框架的安装目录。
View
- View最明显的改动是视图内的特殊变量 $this 不再指向当前控制器或小部件,而是指向视图对象,要在其他render() 现在只返回渲染结果,而不是直接显示它,所以现在你必须显式地把它 echo 出来。Yii 2.0 也装备了两种流行模板引擎的官方支持:Smarty 和 Twig。
Model
- 然后就是Model,CFromModel被完全弃用,其实整个yii2.0,C开头的基类都去掉C,有一个函数必须记下:
Yii 2.0 引进了名为 yii\base\Model::scenarios() 的新方法来声明支持的场景,并指明在哪个场景下某属性必须经过验证,可否被视为安全值等等。如:
$model = new User(['scenario' => 'login']);
public function scenarios()
{
return [
'backend' => ['email', 'role'],//对于 backend 场景,email 和 role 属性值都是安全的,且能进行批量赋值
'frontend' => ['email', '!role'],
];
}
Controller
这些变化最明显的影响是,当你在写控制器操作的代码时,应该返回(return)要渲染的内容而不是输出(echo);
Widget
为了让框架获得更好的 IDE 支持,Yii 2.0 引进了一个调用小部件的新语法。包含 yii\base\Widget::begin(),yii\base\Widget::end() 和 yii\base\Widget::widget() 三个静态方法
field
一个表单栏是一个由标签、输入框、错误消息(可能还有提示文字)组成的容器,被表示为一个 yii\widgets\ActiveField 对象。
Query Builder
Yii 2.0 以 yii\db\Query 对象的形式表示一个数据库查询,这个对象使用 yii\db\QueryBuilder 在幕后生成 SQL 语句
Active Record(变化较大)
- yii\db\ActiveRecord::find() 方法进行查询
- 可以通过调用 $customer->orders 来访问关联表中某用户的订单了,当生成返回大量记录的查询时
- 可以链式书写 yii\db\ActiveQuery::asArray() 方法,这样会以数组的形式返回查询结果,而不必返回 yii\db\ActiveRecord 对象,这能显著降低因大量记录读取所消耗的 CPU 时间和内存
- 你不能再通过公共变量定义属性(Attribute)的默认值了。如果你需要这么做的话,可以在你的记录类的 init 方法中设置它们
安装
通过归档文件安装,修改 config/web.php 文件,给 cookieValidationKey 配置项添加一个密钥,这段不能遗忘。
‘cookieValidationKey’ => ‘在此处输入你的密钥’,
————————–不是新特性———————————
debug log
入口文件在浏览器底部可以看到一个工具栏。这是 Yii 提供的很有用的调试工具,可以记录并显示大量的调试信息,例如日志信息,响应状态,数据库查询等等。
yii运行机制
用户向入口脚本 web/index.php 发起请求。
入口脚本加载应用配置并创建一个应用实例去处理请求。
应用通过请求组件解析请求的路由。
应用创建一个控制器实例去处理请求。
控制器创建一个操作实例并针对操作执行过滤器。
如果任何一个过滤器返回失败,则操作退出。
如果所有过滤器都通过,操作将被执行。
操作会加载一个数据模型,或许是来自数据库。
操作会渲染一个视图,把数据模型提供给它。
渲染结果返回给响应组件。
响应组件发送渲染结果给用户浏览器。
view获取数据
message 参数在输出之前被 yii\helpers\Html::encode() 方法处理过。这很有必要,当参数来自于最终用户时,参数中可能隐含的恶意 JavaScript 代码会导致跨站脚本(XSS)攻击。
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
<?= Html::encode("{$country->name} ({$country->code})") ?>
表单
Model
- 补充:yii\base\Model 被用于普通模型类的父类并与数据表无关。yii\db\ActiveRecord 通常是普通模型类的父类但与数据表有关联
- ActiveRecord类现在 你不用在类里面写任何代码。Yii 2.0就能根据类名去猜测对应的数据表名。
- 如果类名和数据表名不能直接对应,可以覆写 yii\db\ActiveRecord::tableName() 方法去显式指定相关表名
Controller
if ($model->load(Yii::$app->request->post()) && $model->validate()) //$model->load(Yii::$app->request->post() Yii 2.0 里面使用
index.php
入口脚本主要完成以下工作:
定义全局常量;
注册 Composer 自动加载器;
包含 Yii 类文件;
加载应用配置;
创建一个应用实例并配置;
调用 yii\base\Application::run() 来处理请求。
web.php
配置路径别名
[
'aliases' => [
'@name1' => 'path/to/path1',
'@name2' => 'path/to/path2',
],
]
该属性允许你指定一个控制器ID到任意控制器类。Yii遵循一个默认的 规则指定控制器ID到任意控制器类,该属性指定控制器类默认的命名空间,默认为app\controllers。
[
'controllerMap' => [
[
'account' => 'app\controllers\UserController',
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
],
]
该属性提供一种方式修改PHP运行环境中的默认时区,配置该属性本质上就是调用PHP函数 date_default_timezone_set()
[
'timeZone' => 'America/Los_Angeles',
]
组件
谨慎注册太多应用组件,应用组件就像全局变量,使用太多可能加大测试和维护的难度。 一般情况下可以在需要时再创建本地组件。
命名空间:
article 对应 app\controllers\ArticleController;
post-comment 对应 app\controllers\PostCommentController;
admin/post-comment 对应 app\controllers\admin\PostCommentController
设置默认控制器
'defaultRoute' => 'main',