yii2简明笔记

34 阅读11分钟

yii2简明笔记

Composer 安装 composer global require "fxp/composer-asset-plugin:1.0.0-beta4" composer create-project --prefer-dist yiisoft/yii2-app-basic basic http://localhost/basic/web/index.php

应用结构

应用中最重要的目录和文件(假设应用根目录是 basic):

basic/ 应用根目录 composer.json Composer 配置文件, 描述包信息 config/ 包含应用配置及其它配置 console.php 控制台应用配置信息 web.php Web 应用配置信息 commands/ 包含控制台命令类 controllers/ 包含控制器类 models/ 包含模型类 runtime/ 包含 Yii 在运行时生成的文件,例如日志和缓存文件 vendor/ 包含已经安装的 Composer 包,包括 Yii 框架自身 views/ 包含视图文件 web/ Web 应用根目录,包含 Web 入口文件 assets/ 包含 Yii 发布的资源文件(javascript 和 css) index.php 应用入口文件 yii Yii 控制台命令执行脚本

index.php?r=site/index

控制器 方法名称以actionXXXX命名 渲染模板 return this>render(view,[model=>this->render('view', [ 'model' => model,]); 跳转 return this>redirect([view,id=>this->redirect(['view', 'id' => model->id]); 控制器ID article admin/article 控制器命名空间下 admin子目录中 article 控制器

操作参数 通过get填充进去 会进行类型检查 默认操作 public $defaultAction = 'home'; 只需修改这个属性即可

视图 this指向[[yii\web\Viewviewcomponent]]来管理和渲染这个视图文件this 指向 [[yii\web\View|view component]] 来管理和渲染这个视图文件 model 这些变量代表从控制器或其他触发视图渲染的对象 传入 到视图的数据。 安全 use yii\helpers\Html; Html::encode($user->name) 将用户输入数据进行转码和过滤

use yii\helpers\HtmlPurifier; HtmlPurifier::process($post->text) 组织视图 控制器渲染的视图文件默认放在 @app/views/ControllerID 目录下, 其中 ControllerID 对应 控制器 ID, 例如控制器类为 PostController,视图文件目录应为 @app/views/post, 控制器类 PostCommentController 对应的目录为 @app/views/post-comment, 如果是模块中的控制器,目录应为 [[yii\base\Module::basePath|module directory]] 模块目录下的 views/ControllerID 目录;

小部件 渲染的视图文件默认放在 WidgetPath/views 目录, 其中 WidgetPath 代表小部件类文件所在的目录; ####可覆盖控制器或小部件的 [[yii\base\ViewContextInterface::getViewPath()]] 方法来自定义视图文件默认目录。

控制器中渲染视图 [[yii\base\Controller::render()|render()]]: 渲染一个 视图名 并使用一个 布局 返回到渲染结果。 [[yii\base\Controller::renderPartial()|renderPartial()]]: 渲染一个 视图名 并且不使用布局。 [[yii\web\Controller::renderAjax()|renderAjax()]]: 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。 小部件中渲染 [[yii\base\Widget::render()|render()]]: 渲染一个 视图名. 视图中渲染 [[yii\base\View::render()|render()]]: 渲染一个 视图名. [[yii\web\View::renderAjax()|renderAjax()]]: 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。 其他地方渲染 // 显示视图文件 "@app/views/site/license.php" echo \Yii::app>view>renderFile(@app/views/site/license.php);视图存放路径在控制器中app\controllers\PostController调用app->view->renderFile('@app/views/site/license.php'); 视图存放路径 在控制器中 app\controllers\PostController 调用 this->render('view'), 渲染 @app/views/post/view.php 视图文件, 当在该视图文件中 调用 $this->render('_overview') 渲染 @app/views/post/_overview.php 视图文件。

视图中访问数据 推送方式 常规方法 类似CI和其它框架 拉取方式 可让视图从 [[yii\base\View|view component]]视图组件或其他对象中主动获得数据(如Yii::app)app) this->context可获取到控制器ID

context->id ?>

视图间共享数据 视图中定义:$this->params['breadcrumbs'][] = 'About Us'; 视图或者布局中使用

isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], ]) ?>

布局 为了重用视图 布局默认存储在 @app/views/layouts 模块中使用的布局 [[yii\base\Module::basePath|module directory]]模块目录 下的views/layouts路径下, 可配置 [[yii\base\Module::layoutPath]] 来自定义应用或模块的布局默认路径。 变量 this前者对应和普通视图类似的[[yii\base\Viewview]]视图组件this 前者对应和普通视图类似的[[yii\base\View|view]] 视图组件 content 后者包含调用[[yii\base\Controller::render()|render()]]方法渲染内容视图的结果

控制器可以修改 $layout 属性更改所属布局 如果控制器的 [[yii\base\Controller::layout]] 属性不为空null,使用它作为布局的值, 控制器的 [[yii\base\Controller::module|module]]模块 作为上下文模块。 如果 [[yii\base\Controller::layout|layout]] 为空,从控制器的祖先模块(包括应用) 开始找 第一个 [[yii\base\Module::layout|layout]] 属性不为空的模块,使用该模块作为上下文模块, 并将它的[[yii\base\Module::layout|layout]] 的值作为布局的值, 如果都没有找到,表示不使用布局。

嵌套布局 重用布局

beginContent('@app/views/layouts/base.php'); ?>

...child layout content here...

endContent(); ?>

使用数据块

模型 属性: 对应表的字段 属性标签: 用于提示信息等等 块赋值: 支持一步给许多属性赋值; 验证规则: 确保输入数据符合所申明的验证规则; 数据导出: 允许模型数据导出为自定义格式的数组。

场景:在不同的场景下,模型可能会使用不同的业务规则和逻辑

过滤器 过滤器是 控制器 动作 执行之前或之后执行的对象。 预过滤 后过滤 控制器类的过滤器默认应用到该类的 所有 动作

小部件 视图重用 模块 控制器+视图重用【如用户管理,评论管理,可以开发成模块】

forum/
Module.php 模块类文件
controllers/ 包含控制器类文件
DefaultController.php default 控制器类文件 models/ 包含模型类文件 views/ 包含控制器视图文件和布局文件 layouts/ 包含布局文件 default/ 包含DefaultController控制器视图文件 index.php index视图文件

index.php?r=forum/post/index Module.php

params['foo'] = 'bar'; // ... 其他初始化代码 ... // 从config.php加载配置来初始化模块 \Yii::configure($this, require(__DIR__ . '/config.php')); } } "; echo $version; } public function actionTest($message) { echo __FILE__; // return $this->render('test'); } } 资源 Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等 资源包 Yii在资源包中管理资源,资源包简单的说就是放在一个目录下的资源集合, 当在视图中注册一个资源包,在渲染Web页面时会包含包中的CSS和JavaScript文件。 使用资源包 目的 通过AppAsset来管理js和css 通过写配置维护js和css文件 自定义资源包 配置js的路径及是否禁用Asset Extensions 修改 composer.json 使用composer install安装 路由 解析路由 缺省路由:site/index catchAll 路由(全拦截路由) 设置维护页面,所有页面跳转到维护页面 路由目的:解析出模块(Module)、控制器(Controller)或操作(action)的 ID 请求Requests http post和get封装 use yii; $request = Yii::$app->request; $get = $request->get(); $id = $request->get('id'); //取值 $id = $request->get('id', 1); //设置默认值 $post = $request->post(); $params = $request->bodyParams; 获取除了get以为的参数 $param = $request->getBodyParam('id'); 获取特定的参数值 if ($request->isAjax) { // the request is an AJAX request } if ($request->isGet) { // the request method is GET } if ($request->isPost) { // the request method is POST } if ($request->isPut) { // the request method is PUT } $headers = Yii::$app->request->headers; 响应 可以自定义响应的状态码 Yii::$app->response->statusCode = 200; 及抛出异常 throw new \yii\web\NotFoundHttpException; 设置响应主体的格式 Yii::$app->response->content = 'hello world!'; $response = Yii::$app->response; $response->format = \yii\web\Response::FORMAT_JSON; $response->data = ['message' => 'hello world']; 跳转 return $this->redirect('http://baidu.com/new', 301); \Yii::$app->response->redirect('http://baidu.com/new', 301)->send(); 错误处理 自定义错误显示 方法 视图 日志 日志级别 日志存位置 DB EMAIL FILE 日志过滤 通过日志级别和日志分类 prefix 定义前缀 可以通过回调方法 logVars 定义需要保存的变量 $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION and $_SERVER 等等 可以做过滤筛选 关键概念 组件(Component) 属性 行为 事件 属性(Property)通过setter跟getter 行为:方法和属性重用 配置:配置及常量 类自动加载:一个是yii自动加载 另一个使用composer yii规范路径app\components\MyClass 别名(Aliases):别名用来表示文件路径和 URL Active Record AR 类关联一张数据表 属性对应表字段 继承 yii\db\ActiveRecord 并实现 tableName 方法 访问列数据 属性对应表字段 切换数据库 覆盖yii\db\ActiveRecord::getDb()方法 查询数据 [[yii\db\ActiveRecord::find()]] 支持链式语法 [[yii\db\ActiveRecord::findBySql()]] 使用原生sql查询 两个快捷方法:findOne 和 findAll() 以数组形式获取数据 ->asArray()函数 批量获取数据 操作数据 AR 提供以下方法插入、更新和删除与 AR 对象关联的那张表中的某一行: [[yii\db\ActiveRecord::save()|save()]] 包含插入和更新 [[yii\db\ActiveRecord::insert()|insert()]] [[yii\db\ActiveRecord::update()|update()]] [[yii\db\ActiveRecord::delete()|delete()]] [[yii\db\ActiveRecord::updateCounters()|updateCounters()]] [[yii\db\ActiveRecord::updateAll()|updateAll()]] [[yii\db\ActiveRecord::updateAllCounters()|updateAllCounters()]] [[yii\db\ActiveRecord::deleteAll()|deleteAll()]] 总之就是通过占位符和数组形式传参,最终生成sql语句 数据输入与有效性验证 [[yii\base\Model::rules()|rules()]] 验证规则 [[yii\base\Model::validate()|validate()]] 验证 读取默认值loadDefaultValues() AR的生命周期 理解AR的生命周期对于你操作数据库非常重要。生命周期通常都会有些典型的事件存在。对于开发AR的behaviors来说非常有用。 当你实例化一个新的AR对象时,我们将获得如下的生命周期: constructor [[yii\db\ActiveRecord::init()|init()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] 事件 当你通过 [[yii\db\ActiveRecord::find()|find()]] 方法查询数据时,每个AR实例都将有以下生命周期: constructor [[yii\db\ActiveRecord::init()|init()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] 事件 [[yii\db\ActiveRecord::afterFind()|afterFind()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_FIND|EVENT_AFTER_FIND]] 事件 当通过 [[yii\db\ActiveRecord::save()|save()]] 方法写入或者更新数据时, 我们将获得如下生命周期: [[yii\db\ActiveRecord::beforeValidate()|beforeValidate()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE|EVENT_BEFORE_VALIDATE]] 事件 [[yii\db\ActiveRecord::afterValidate()|afterValidate()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_VALIDATE|EVENT_AFTER_VALIDATE]] 事件 [[yii\db\ActiveRecord::beforeSave()|beforeSave()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_BEFORE_INSERT|EVENT_BEFORE_INSERT]] 或 [[yii\db\ActiveRecord::EVENT_BEFORE_UPDATE|EVENT_BEFORE_UPDATE]] 事件 执行实际的数据写入或更新 [[yii\db\ActiveRecord::afterSave()|afterSave()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 或 [[yii\db\ActiveRecord::EVENT_AFTER_UPDATE|EVENT_AFTER_UPDATE]] 事件 最后,当调用 [[yii\db\ActiveRecord::delete()|delete()]] 删除数据时, 我们将获得如下生命周期: [[yii\db\ActiveRecord::beforeDelete()|beforeDelete()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_BEFORE_DELETE|EVENT_BEFORE_DELETE]] 事件 执行实际的数据删除 [[yii\db\ActiveRecord::afterDelete()|afterDelete()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_DELETE|EVENT_AFTER_DELETE]] 事件 中文提示 'language' => 'zh-cn', 'sourceLanguage' => 'zh-cn', 查询关联的数据 可以过滤 支持链式语法 通过定义getxxx返回关系 例如 public function getPosts() { return $this->hasMany(Post::className(),['tid'=>'tid']); } 定义完后数据会自动填充到对应的表同名属性数组中 延迟加载和即时加载 逆关系 JOIN 类型关联查询 关联表操作 附加对象到模型当中 作用域====>可以自定义链式语法 目的:条件重用 事务操作=====>瘦控制器/肥模型 输入验证 validate 验证 public function rules() 验证规则 自定义错误信息 ['username', 'required', 'message' => 'Please choose a username.'], 验证事件 验证之前和验证之后 条件式验证 数据预处理 [['username', 'email'], 'trim'], 处理空输入 设置默认值 ['level', 'default', 'value' => 1], 临时验证 $validator = new yii\validators\EmailValidator(); $validator->validate($email, $error) 创建验证器(Validators) 行内验证器 通过匿名方法去验证 /** * @param string $attribute 当前被验证的特性 * @param array $params 以名-值对形式提供的额外参数 */ function ($attribute, $params) 独立验证器(Standalone Validators) 自己实现客户端验证 ['level', 'default', 'value' => 1], 上传文件 1.创建模型UploadForm 定义规则 2.UploadedFile::getInstance($model, 'file'); 通过单例去获取上传实例 3. $model->file && $model->validate() $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); 数据格式器 echo Yii::$app->formatter->asDate('2014-01-01', 'long'); 分页 控制器分页 $pages = new Pagination(['totalCount' => $countQuery->count()]); 渲染 // display pagination echo LinkPager::widget([ 'pagination' => $pages, ]); 排序 缓存 服务端缓存 缓存粒度:数据缓存 片段缓存 页面缓存 客户端缓存 HTTP缓存 缓存组件 可配置 'components' => [ 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => 'server1', 'port' => 11211, 'weight' => 100, ], [ 'host' => 'server2', 'port' => 11211, 'weight' => 50, ], ], ], ], Yii::$app->cache 访问 缓存过期 // 将数据在缓存中保留 45 秒 $cache->set($key, $data, 45); sleep(50); $data = $cache->get($key); if ($data === false) { // $data 已过期,或者在缓存中找不到 } 缓存依赖 // 创建一个对 example.txt 文件修改时间的缓存依赖 $dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']); // 缓存数据将在30秒后超时 // 如果 example.txt 被修改,它也可能被更早地置为失效状态。 $cache->set($key, $data, 30, $dependency); // 缓存会检查数据是否已超时。 // 它还会检查关联的依赖是否已变化。 // 符合任何一个条件时都会返回 false。 $data = $cache->get($key); 片段缓存 路由 如果用户的请求地址为 http://hostname/index.php?r=site/index, 会执行site 控制器的index 操作 yii2简明笔记 Composer 安装 composer global require "fxp/composer-asset-plugin:1.0.0-beta4" composer create-project --prefer-dist yiisoft/yii2-app-basic basic http://localhost/basic/web/index.php 应用结构 应用中最重要的目录和文件(假设应用根目录是 basic): basic/ 应用根目录 composer.json Composer 配置文件, 描述包信息 config/ 包含应用配置及其它配置 console.php 控制台应用配置信息 web.php Web 应用配置信息 commands/ 包含控制台命令类 controllers/ 包含控制器类 models/ 包含模型类 runtime/ 包含 Yii 在运行时生成的文件,例如日志和缓存文件 vendor/ 包含已经安装的 Composer 包,包括 Yii 框架自身 views/ 包含视图文件 web/ Web 应用根目录,包含 Web 入口文件 assets/ 包含 Yii 发布的资源文件(javascript 和 css) index.php 应用入口文件 yii Yii 控制台命令执行脚本 index.php?r=site/index 控制器 方法名称以actionXXXX命名 渲染模板 return $this->render('view', [ 'model' => $model,]); 跳转 return $this->redirect(['view', 'id' => $model->id]); 控制器ID article admin/article 控制器命名空间下 admin子目录中 article 控制器 操作参数 通过get填充进去 会进行类型检查 默认操作 public $defaultAction = 'home'; 只需修改这个属性即可 视图 $this 指向 [[yii\web\View|view component]] 来管理和渲染这个视图文件 $model 这些变量代表从控制器或其他触发视图渲染的对象 传入 到视图的数据。 安全 use yii\helpers\Html; Html::encode($user->name) 将用户输入数据进行转码和过滤 use yii\helpers\HtmlPurifier; HtmlPurifier::process($post->text) 组织视图 控制器渲染的视图文件默认放在 @app/views/ControllerID 目录下, 其中 ControllerID 对应 控制器 ID, 例如控制器类为 PostController,视图文件目录应为 @app/views/post, 控制器类 PostCommentController 对应的目录为 @app/views/post-comment, 如果是模块中的控制器,目录应为 [[yii\base\Module::basePath|module directory]] 模块目录下的 views/ControllerID 目录; 小部件 渲染的视图文件默认放在 WidgetPath/views 目录, 其中 WidgetPath 代表小部件类文件所在的目录; ####可覆盖控制器或小部件的 [[yii\base\ViewContextInterface::getViewPath()]] 方法来自定义视图文件默认目录。 控制器中渲染视图 [[yii\base\Controller::render()|render()]]: 渲染一个 视图名 并使用一个 布局 返回到渲染结果。 [[yii\base\Controller::renderPartial()|renderPartial()]]: 渲染一个 视图名 并且不使用布局。 [[yii\web\Controller::renderAjax()|renderAjax()]]: 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。 小部件中渲染 [[yii\base\Widget::render()|render()]]: 渲染一个 视图名. 视图中渲染 [[yii\base\View::render()|render()]]: 渲染一个 视图名. [[yii\web\View::renderAjax()|renderAjax()]]: 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。 其他地方渲染 // 显示视图文件 "@app/views/site/license.php" echo \Yii::$app->view->renderFile('@app/views/site/license.php'); 视图存放路径 在控制器中 app\controllers\PostController 调用 $this->render('view'), 渲染 @app/views/post/view.php 视图文件, 当在该视图文件中 调用 $this->render('_overview') 渲染 @app/views/post/_overview.php 视图文件。 视图中访问数据 推送方式 常规方法 类似CI和其它框架 拉取方式 可让视图从 [[yii\base\View|view component]]视图组件或其他对象中主动获得数据(如Yii::$app) $this->context可获取到控制器ID context->id ?>

视图间共享数据 视图中定义:$this->params['breadcrumbs'][] = 'About Us'; 视图或者布局中使用

isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], ]) ?>

布局 为了重用视图 布局默认存储在 @app/views/layouts 模块中使用的布局 [[yii\base\Module::basePath|module directory]]模块目录 下的views/layouts路径下, 可配置 [[yii\base\Module::layoutPath]] 来自定义应用或模块的布局默认路径。 变量 this前者对应和普通视图类似的[[yii\base\Viewview]]视图组件this 前者对应和普通视图类似的[[yii\base\View|view]] 视图组件 content 后者包含调用[[yii\base\Controller::render()|render()]]方法渲染内容视图的结果

控制器可以修改 $layout 属性更改所属布局 如果控制器的 [[yii\base\Controller::layout]] 属性不为空null,使用它作为布局的值, 控制器的 [[yii\base\Controller::module|module]]模块 作为上下文模块。 如果 [[yii\base\Controller::layout|layout]] 为空,从控制器的祖先模块(包括应用) 开始找 第一个 [[yii\base\Module::layout|layout]] 属性不为空的模块,使用该模块作为上下文模块, 并将它的[[yii\base\Module::layout|layout]] 的值作为布局的值, 如果都没有找到,表示不使用布局。

嵌套布局 重用布局

beginContent('@app/views/layouts/base.php'); ?>

...child layout content here...

endContent(); ?>

使用数据块

模型 属性: 对应表的字段 属性标签: 用于提示信息等等 块赋值: 支持一步给许多属性赋值; 验证规则: 确保输入数据符合所申明的验证规则; 数据导出: 允许模型数据导出为自定义格式的数组。

场景:在不同的场景下,模型可能会使用不同的业务规则和逻辑

过滤器 过滤器是 控制器 动作 执行之前或之后执行的对象。 预过滤 后过滤 控制器类的过滤器默认应用到该类的 所有 动作

小部件 视图重用 模块 控制器+视图重用【如用户管理,评论管理,可以开发成模块】

forum/
Module.php 模块类文件
controllers/ 包含控制器类文件
DefaultController.php default 控制器类文件 models/ 包含模型类文件 views/ 包含控制器视图文件和布局文件 layouts/ 包含布局文件 default/ 包含DefaultController控制器视图文件 index.php index视图文件

index.php?r=forum/post/index Module.php

params['foo'] = 'bar'; // ... 其他初始化代码 ... // 从config.php加载配置来初始化模块 \Yii::configure($this, require(__DIR__ . '/config.php')); } } "; echo $version; } public function actionTest($message) { echo __FILE__; // return $this->render('test'); } } 资源 Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等 资源包 Yii在资源包中管理资源,资源包简单的说就是放在一个目录下的资源集合, 当在视图中注册一个资源包,在渲染Web页面时会包含包中的CSS和JavaScript文件。 使用资源包 目的 通过AppAsset来管理js和css 通过写配置维护js和css文件 自定义资源包 配置js的路径及是否禁用Asset Extensions 修改 composer.json 使用composer install安装 路由 解析路由 缺省路由:site/index catchAll 路由(全拦截路由) 设置维护页面,所有页面跳转到维护页面 路由目的:解析出模块(Module)、控制器(Controller)或操作(action)的 ID 请求Requests http post和get封装 use yii; $request = Yii::$app->request; $get = $request->get(); $id = $request->get('id'); //取值 $id = $request->get('id', 1); //设置默认值 $post = $request->post(); $params = $request->bodyParams; 获取除了get以为的参数 $param = $request->getBodyParam('id'); 获取特定的参数值 if ($request->isAjax) { // the request is an AJAX request } if ($request->isGet) { // the request method is GET } if ($request->isPost) { // the request method is POST } if ($request->isPut) { // the request method is PUT } $headers = Yii::$app->request->headers; 响应 可以自定义响应的状态码 Yii::$app->response->statusCode = 200; 及抛出异常 throw new \yii\web\NotFoundHttpException; 设置响应主体的格式 Yii::$app->response->content = 'hello world!'; $response = Yii::$app->response; $response->format = \yii\web\Response::FORMAT_JSON; $response->data = ['message' => 'hello world']; 跳转 return $this->redirect('http://baidu.com/new', 301); \Yii::$app->response->redirect('http://baidu.com/new', 301)->send(); 错误处理 自定义错误显示 方法 视图 日志 日志级别 日志存位置 DB EMAIL FILE 日志过滤 通过日志级别和日志分类 prefix 定义前缀 可以通过回调方法 logVars 定义需要保存的变量 $_GET, $_POST, $_FILES, $_COOKIE, $_SESSION and $_SERVER 等等 可以做过滤筛选 关键概念 组件(Component) 属性 行为 事件 属性(Property)通过setter跟getter 行为:方法和属性重用 配置:配置及常量 类自动加载:一个是yii自动加载 另一个使用composer yii规范路径app\components\MyClass 别名(Aliases):别名用来表示文件路径和 URL Active Record AR 类关联一张数据表 属性对应表字段 继承 yii\db\ActiveRecord 并实现 tableName 方法 访问列数据 属性对应表字段 切换数据库 覆盖yii\db\ActiveRecord::getDb()方法 查询数据 [[yii\db\ActiveRecord::find()]] 支持链式语法 [[yii\db\ActiveRecord::findBySql()]] 使用原生sql查询 两个快捷方法:findOne 和 findAll() 以数组形式获取数据 ->asArray()函数 批量获取数据 操作数据 AR 提供以下方法插入、更新和删除与 AR 对象关联的那张表中的某一行: [[yii\db\ActiveRecord::save()|save()]] 包含插入和更新 [[yii\db\ActiveRecord::insert()|insert()]] [[yii\db\ActiveRecord::update()|update()]] [[yii\db\ActiveRecord::delete()|delete()]] [[yii\db\ActiveRecord::updateCounters()|updateCounters()]] [[yii\db\ActiveRecord::updateAll()|updateAll()]] [[yii\db\ActiveRecord::updateAllCounters()|updateAllCounters()]] [[yii\db\ActiveRecord::deleteAll()|deleteAll()]] 总之就是通过占位符和数组形式传参,最终生成sql语句 数据输入与有效性验证 [[yii\base\Model::rules()|rules()]] 验证规则 [[yii\base\Model::validate()|validate()]] 验证 读取默认值loadDefaultValues() AR的生命周期 理解AR的生命周期对于你操作数据库非常重要。生命周期通常都会有些典型的事件存在。对于开发AR的behaviors来说非常有用。 当你实例化一个新的AR对象时,我们将获得如下的生命周期: constructor [[yii\db\ActiveRecord::init()|init()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] 事件 当你通过 [[yii\db\ActiveRecord::find()|find()]] 方法查询数据时,每个AR实例都将有以下生命周期: constructor [[yii\db\ActiveRecord::init()|init()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] 事件 [[yii\db\ActiveRecord::afterFind()|afterFind()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_FIND|EVENT_AFTER_FIND]] 事件 当通过 [[yii\db\ActiveRecord::save()|save()]] 方法写入或者更新数据时, 我们将获得如下生命周期: [[yii\db\ActiveRecord::beforeValidate()|beforeValidate()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE|EVENT_BEFORE_VALIDATE]] 事件 [[yii\db\ActiveRecord::afterValidate()|afterValidate()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_VALIDATE|EVENT_AFTER_VALIDATE]] 事件 [[yii\db\ActiveRecord::beforeSave()|beforeSave()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_BEFORE_INSERT|EVENT_BEFORE_INSERT]] 或 [[yii\db\ActiveRecord::EVENT_BEFORE_UPDATE|EVENT_BEFORE_UPDATE]] 事件 执行实际的数据写入或更新 [[yii\db\ActiveRecord::afterSave()|afterSave()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] 或 [[yii\db\ActiveRecord::EVENT_AFTER_UPDATE|EVENT_AFTER_UPDATE]] 事件 最后,当调用 [[yii\db\ActiveRecord::delete()|delete()]] 删除数据时, 我们将获得如下生命周期: [[yii\db\ActiveRecord::beforeDelete()|beforeDelete()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_BEFORE_DELETE|EVENT_BEFORE_DELETE]] 事件 执行实际的数据删除 [[yii\db\ActiveRecord::afterDelete()|afterDelete()]]: 会触发一个 [[yii\db\ActiveRecord::EVENT_AFTER_DELETE|EVENT_AFTER_DELETE]] 事件 中文提示 'language' => 'zh-cn', 'sourceLanguage' => 'zh-cn', 查询关联的数据 可以过滤 支持链式语法 通过定义getxxx返回关系 例如 public function getPosts() { return $this->hasMany(Post::className(),['tid'=>'tid']); } 定义完后数据会自动填充到对应的表同名属性数组中 延迟加载和即时加载 逆关系 JOIN 类型关联查询 关联表操作 附加对象到模型当中 作用域====>可以自定义链式语法 目的:条件重用 事务操作=====>瘦控制器/肥模型 输入验证 validate 验证 public function rules() 验证规则 自定义错误信息 ['username', 'required', 'message' => 'Please choose a username.'], 验证事件 验证之前和验证之后 条件式验证 数据预处理 [['username', 'email'], 'trim'], 处理空输入 设置默认值 ['level', 'default', 'value' => 1], 临时验证 $validator = new yii\validators\EmailValidator(); $validator->validate($email, $error) 创建验证器(Validators) 行内验证器 通过匿名方法去验证 /** * @param string $attribute 当前被验证的特性 * @param array $params 以名-值对形式提供的额外参数 */ function ($attribute, $params) 独立验证器(Standalone Validators) 自己实现客户端验证 ['level', 'default', 'value' => 1], 上传文件 1.创建模型UploadForm 定义规则 2.UploadedFile::getInstance($model, 'file'); 通过单例去获取上传实例 3. $model->file && $model->validate() $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); 数据格式器 echo Yii::$app->formatter->asDate('2014-01-01', 'long'); 分页 控制器分页 $pages = new Pagination(['totalCount' => $countQuery->count()]); 渲染 // display pagination echo LinkPager::widget([ 'pagination' => $pages, ]); 排序 缓存 服务端缓存 缓存粒度:数据缓存 片段缓存 页面缓存 客户端缓存 HTTP缓存 缓存组件 可配置 'components' => [ 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => 'server1', 'port' => 11211, 'weight' => 100, ], [ 'host' => 'server2', 'port' => 11211, 'weight' => 50, ], ], ], ], Yii::$app->cache 访问 缓存过期 // 将数据在缓存中保留 45 秒 $cache->set($key, $data, 45); sleep(50); $data = $cache->get($key); if ($data === false) { // $data 已过期,或者在缓存中找不到 } 缓存依赖 // 创建一个对 example.txt 文件修改时间的缓存依赖 $dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']); // 缓存数据将在30秒后超时 // 如果 example.txt 被修改,它也可能被更早地置为失效状态。 $cache->set($key, $data, 30, $dependency); // 缓存会检查数据是否已超时。 // 它还会检查关联的依赖是否已变化。 // 符合任何一个条件时都会返回 false。 $data = $cache->get($key); 片段缓存 路由 如果用户的请求地址为 http://hostname/index.php?r=site/index, 会执行site 控制器的index 操作 ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_24700495/article/details/144395573