当前位置: 首页 > 工具软件 > yii2-doc > 使用案例 >

yii2.0官方文档笔记

南门茂才
2023-12-01

一直都在用yii1.1,也写过几个小项目,然后现在2.0出来了,懒得看文档重新学就直接用2.0照着别人写,最后还是写不下去了,想来从头好好看yii2.0。写这篇也算是笔记吧。

说说几个较大的改动点:
1. php 5.4的一些新特性都用上,包括命名空间,数组短语法等等。
2. 路径别名扩大至文件/目录路径和 URL,路径别名必须以 @ 符号开头,@yii 就是指向 Yii 安装目录的别名,Zend Framework,你只需定义一个名为 @Zend 的路径别名指向该框架的安装目录。

View

  1. View最明显的改动是视图内的特殊变量 $this 不再指向当前控制器或小部件,而是指向视图对象,要在其他render() 现在只返回渲染结果,而不是直接显示它,所以现在你必须显式地把它 echo 出来。Yii 2.0 也装备了两种流行模板引擎的官方支持:Smarty 和 Twig。

Model

  1. 然后就是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(变化较大)

  1. yii\db\ActiveRecord::find() 方法进行查询
  2. 可以通过调用 $customer->orders 来访问关联表中某用户的订单了,当生成返回大量记录的查询时
  3. 可以链式书写 yii\db\ActiveQuery::asArray() 方法,这样会以数组的形式返回查询结果,而不必返回 yii\db\ActiveRecord 对象,这能显著降低因大量记录读取所消耗的 CPU 时间和内存
  4. 你不能再通过公共变量定义属性(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

  1. 补充:yii\base\Model 被用于普通模型类的父类并与数据表无关。yii\db\ActiveRecord 通常是普通模型类的父类但与数据表有关联
  2. ActiveRecord类现在 你不用在类里面写任何代码。Yii 2.0就能根据类名去猜测对应的数据表名。
    1. 如果类名和数据表名不能直接对应,可以覆写 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',
 类似资料: