目录
- 2 配置文件
- 3 控制器 #Controller
- 4 #Model 数据模型
- 5 #createCommand 操作数据库 #数据库 #Command
- 6 #QueryBuilder 查询构建器 #Query 操作数据库 #数据库
- 6.1 对比Command、ActiveRecord、Query操作 #createCommand #ActiveRecord #all #find #one
- 6.2 连接指定表、数据库
- 6.3 查询 #select
- 6.4 常用函数,返回结果集数组 #聚合函数 #all #one #count #exists #column
- 6.5 条件查询 #where
- 6.6 排序 #orderBy #addOrderBy
- 6.7 分组 #groupBy
- 6.8 分页 #Pagination #limit #offset
- 6.9 管理事务 #beginTransaction #commit #rollBack #transaction
- 7 #表单 #form
- 8 组件
- 9 #ArrayHelper 数组工具类
- 10 控制台执行yii2脚本
—#
1 安装yii2
composer create-project --prefer-dist yiisoft/yii2-app-basic yii
1.1 yii2目录结构
2 配置文件
2.1 使用restful风格url #urlManager #重定向
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
2.2 #catchAll 把所有请求都重定向到指定页面 #重定向
3 控制器 #Controller
3.1 #defaultAction 默认处理action
url
3.2 创建Controller
3.3 转发到指定php页面进行渲染
3.3.1 渲染函数 #render #renderPartial
如果使用渲染函数转发到指定页面渲染,此时则无法在actionView()
方法内输出echo
,只能在指定页面进行输出
3.3.2 使用自定义的父模板 #content #layouts
3.3.3 模板内调用其他模板的内容 #render
还可以使用render传递参数
3.3.4 数据块 #blocks #beginBlock
3.4 Controller内置函数
3.4.1 #refresh
3.4.2 重定向到指定页面 #重定向 #redirect
3.4.3 例子: #goHome
3.5 参数传递到视图 #参数 #视图 #view
3.5.1 方式一:关联数组传参,推荐 #关联数组
3.5.1.1 例子
3.5.2 方式二:#compact
3.6 处理传参时的xss注入问题 #xss
3.6.1 xss注入问题
输出包含html代码的变量,存在xss注入问题
3.6.2 过滤参数内的html代码 #encode #HtmlPurifier
3.7 全局引入文件内容 #require
3.8 #request 组件,获取请求参数
3.8.1 get请求 #get #todo
注意:这里传参用
&id=2
而不是?id=2
3.8.2 post请求 #post
3.8.2.1 判断请求的方式 #isGet #isPost
3.8.3 获取用户的ip #userIP
3.9 #cookie
3.9.1 增加cookie
3.9.2 读取cookie
3.9.3 删除cookie
读取cookie使用request,增删改cookie使用reponse
3.9.4 配置cookie值加密
3.10 #session
3.11 #缓存
3.11.1 配置缓存组件 #Redis #FileCache
3.11.2 操作缓存
3.12 在view中获取当前的Controller变量 #context #this
view
中的this
的字段context
,即$this->context
,指的是controller
中的$this
<?php
var_dump($this->context->id); //输出Controller
var_dump($this->context->action->id ); // 输出action
var_dump($this->context->enc); // 输出Controller的成员变量
3.13 使用ajax发送请求 #ajax
3.13.1 例子
- view
<?php
$this->registerJsFile('@web/js/test.js');
?>
<button id="ajaxtest" onclick="submitAjax()">test</button>
- controller
public function actionAjax()
{
$id = $_GET['id'];
$uid = $_POST['uid'];
return json_encode(["id" => $id]);
}
- js
function submitAjax(){
$.post({
url:"http://localhost/site/ajax?id=234324",
data:{"uid":111111},
dataType: "json",
success:function(data){
console.log(data);
alert(data.id);
}
})
}
3.14 使用axios发送请求 #axios
3.14.1 配置request组件能处理json格式的参数
使用ajax时,只需要加上
dataType: "json"
即可使用axios时,发送json数据,需要配置
web.php
,这样才能接受到json格式的数据
axios 发送的数据都是json格式的数据,而Yii2默认的配置是不能识别这种格式的,官方文档上已经做了说明,需要在web.php
下进行配置才能识别json数据。
为了使 API 接收 JSON 格式的输入数据,配置 request 应用程序组件的 parsers 属性使用 yii\web\JsonParser
用于JSON输入
'parsers' => [
'application/json' => 'yii\web\JsonParser',
'text/json' => 'yii\web\JsonParser',
]
3.14.2 使用request组件接收json参数 #request
其他方式无法获取的参数,必须使用
request组价
接收参数,即\Yii::$app->request
axiostest() {
axios.post("http://localhost/site/ajax",{
id:23432,
uid:1111,
}
)
.then(res=>{
console.log(res.data.id);
alert(res.data.id);
})
}
public function actionAjax()
{
$req = \Yii::$app->request;
$id = $reqaxio定时器->post('id');
$uid = $req->post('uid');
return json_encode(["id" => $id,'uid'=>$uid]);
}
3.14.3 例子:post请求
- view
<?php
$this->registerJsFile('@web/js/test.js');
?>
<div id="app">
<button @click="axiostest()">test</button>
</div>
- controller
public function actionAjax()
{
$a = \Yii::$app->request;
$id = $a->post('id');
$uid = $a->post('uid');
return json_encode(["id" => $id,'uid'=>$uid]);
}
- js
new Vue({
el:'#app',
data: {
param:{
'id':23432,
'uid':1111,
}
},
methods: {
axiostest() {
axios.post("http://localhost/site/ajax",{
'id':23432,
'uid':1111,
}
)
.then(res=>{
console.log(res.data.id);
alert(res.data.id);
})
}
}
})
4 #Model 数据模型
Model对象放在models目录下
4.1 给model对象的字段批量赋值 #load
4.2 字段值校验 #rules
使用load()函数给model对象字段赋值,如果不符合字段值约束rules,也能赋值,但调用字段值校验函数validate()时会返回false
如果用表单控件
ActiveForm
给model赋值,如果不符合字段值约束规则rules
,则无法提交表单,无法提交请求给后台处理
4.2.1 常见校验规则
4.2.1.1 #safe 不验证字段值
4.2.1.1.1 例子:不检查字段值,可以随意赋值 #safe
如果没有设置safe,则字段值必须要通过校验后,才能给字段赋值,否则无法给model赋值
4.2.1.2 #required 字段值非空
4.2.1.2.1 例子:字段值非空 #required
4.2.1.3 字段取值范围校验 #double #Integer #in
4.2.1.4 格式校验 #email #match
4.2.1.5 字串长度校验 #string
4.2.1.6 唯一值校验 #unique
4.2.1.7 判断字段值是否出现在指定表的字段内 #exist
4.2.1.8 处理两端空格 #trim
trim不是校验规则
4.2.1.9 设置字段默认值 #default
default不是校验规则
4.2.2 自定义字段值校验规则
4.2.3 校验字段值 #validate
4.2.4 例子:表单控件给model对象赋值 #ActiveForm
表单控件给model对象赋值,会自动触发字段校验validate()
表单如果没有写提交地址action,会默认提交给当前的action处理请求
ActiveForm提交默认使用post请求
model层
<?php
namespace app\models;
use yii\base\Model;
class UserForm extends Model{
public $name;
public $email;
public function rules(){
return [
['name','compare',compareValue =>'tom',message=>'不为tom'],
[['name','email'],required,message=>'必选字段'],
[['email'],'email',message=>'不是邮箱'],
];
}
}
controller层
<?php
namespace app\controllers;
use app\models\UserForm;
use Yii;
use yii\web\Controller;
class TestController extends Controller
{
public function actionTest2()
{
$model = new UserForm;
$model->load(Yii::$app->request->post()); // 获取post请求值
if ($model->validate()) { // 成功提交表单后
Yii::$app->session->setFlash("success", '提交表单成功'); // 提示框
}
return $this->render(test2, ['model' => $model]);
}
}
视图层view:表单ActiveForm
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$form = ActiveForm::begin();
?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<div>
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end() ?>
4.3 #ActiveRecord 活动记录,操作数据库 #数据库
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Article extends ActiveRecord
{
public static function tableName() // 设置要连接的表table
{
return 'test_my.rbid_change_info_test';
}
public static function getDb() // 设置要连接的数据库
{
return \Yii::$app->db01;
}
}
4.4 ActiveRecord对象的生命周期 #new #find #save #delete
4.4.1 查询操作 #find #findAll #findOne
find()
返回的是对象ActiveQuery
,ActiveQuery
继承Query
,可以使用QueryBuilder继续查询操作
findAll()
、findOne
返回的是结果集数组
4.4.2 dml操作
dml操作的函数都有返回值(影响的记录数)
4.4.2.1 #save #validate #rules
save()可以用于插入/更新记录到数据库(推荐)
4.4.2.1.1 更新记录 #updateAll
推荐使用save()实现插入、更新操作
save()会触发model对象的字段值验证rules,触发validate()
4.4.2.1.2 新增记录 3.3.2.2
4.4.2.2 删除记录 #delete #deleteAll
4.4.3 关联查询
4.4.3.1 #hasMany 一对多关联
等价于:
4.4.3.2 #hasOne 一对一关联
4.4.3.3 删掉关联查询的缓存 #缓存
4.4.3.4 多次关联查询的性能优化 #with
5 #createCommand 操作数据库 #数据库 #Command
createCommand()返回的是对象
5.1 连接数据库
- 操作数据库
test_my
下的表(dsn中指定了数据库)
'dsn' => 'mysql:host=localhost;dbname=test_my;port=2039'
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_my;port=2039', // 可以指定要连接的数据库,可以不指定
'username' => 'apollo-rw', // 用户名
'password' => 'QBT094bt', // 密码
'charset' => 'utf8'
];
- 如果不指定要连接的数据库时,在操作表时,必须要写上表名,如
test.tb1
'dsn' => 'mysql:host=localhost;port=2039'
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;port=2039', // 可以指定要连接的数据库,可以不指定
'username' => 'apollo-rw', // 用户名
'password' => 'QBT094bt', // 密码
'charset' => 'utf8'
];
5.1.1 不同数据库的dsn写法 #dsn
5.1.2 设置表前缀
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;port=2039',
'username' => 'apollo-rw',
'password' => 'QBT094bt',
'charset' => 'utf8',
'tablePrefix' => 'tb_'
];
5.2 查询数据库 #select
5.2.1 指定数据库、表、列
5.2.2 返回结果集数组 #queryAll #queryOne #queryScalar #queryColumn
// 返回多行. 每行都是列名和值的关联数组.
// 如果该查询没有结果则返回空数组
$posts = Yii::$app->db->createCommand('SELECT * FROM post')
->queryAll();
// 返回一行 (第一行)
// 如果该查询没有结果则返回 false
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')
->queryOne();
// 返回一列 (第一列)
// 如果该查询没有结果则返回空数组
$titles = Yii::$app->db->createCommand('SELECT title FROM post')
->queryColumn();
// 返回一个标量值,第一行第一列
// 如果该查询没有结果则返回 false
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')
->queryScalar();
5.2.3 使用sql占位符,防止sql注入问题 #占位符
写法一:
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id', $_GET['id'])
->bindValue(':status', 1)
->queryOne();
写法二:
$params = [':id' => $_GET['id'], ':status' => 1];
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValues($params)
->queryOne();
写法三:推荐
$params = [':id' => $_GET['id'], ':status' => 1];
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)
->queryAll();
// 等价于
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', [':id' => $_GET['id'], ':status' => 1])
->queryAll();
5.2.3.1 例子
use Yii;
public function actionTest(){
$sql = "select * from rbid_change_info_test where from_rbid=:from_rbid";
$res = Yii::$app->db01->createCommand($sql)
->bindValue(':from_rbid', $_GET['from_rbid'])
->queryAll();
$param = [
'res'=>$res
];
return $this->render('test',$param);
}
5.3 DML操作 #dml
5.3.1 插入操作 #insert #batchInsert
5.3.2 修改操作 #update
5.3.3 删除操作 #delete
6 #QueryBuilder 查询构建器 #Query 操作数据库 #数据库
使用Query对象只能查询数据库,但可以使用createCommand() 来实现dml操作
6.1 对比Command、ActiveRecord、Query操作 #createCommand #ActiveRecord #all #find #one
6.2 连接指定表、数据库
que
use Yii;
public function actionTest2(){
$db01 = Yii::$app->db01; // 连接数据库
$res = (new Query())
->from('rbid_change_info_test')
->Where(['like','from_name','贝纳通'])
->andWhere(['<','month','2021-01-30'])
->limit(10)
->all($db01);
$param = [
res=>$res,
];
return $this->render(test2,$param);
}
6.3 查询 #select
6.3.1 查询指定表,表别名 #form
6.3.2 连接表 #join #leftJoin #rightJoin #innerJoin
6.3.3 全连接 #union
6.3.4 子查询
6.3.5 去重 #distinct
6.3.6 追加查询字段 #addSelect
6.3.7 排序 #order by
6.4 常用函数,返回结果集数组 #聚合函数 #all #one #count #exists #column
6.4.1 获取 #createCommand 操作数据库,返回要执行的sql语句 #Command
createCommand()返回的是对象,all()返回的是数组
获取createCommand后,可以执行dml操作
导入
Query对象只能进行select查询操作
6.4.2 设置索引列 #indexBy
6.5 条件查询 #where
6.5.1 等值查询
6.5.1.1 字符串格式
存在sql注入问题,可以通过占位符处理
6.5.1.2 哈希格式,多条件查询(推荐)
不会有sql注入问题
6.5.1.3 查询集合 #in
即查询
in
#
6.5.2 比较查询 #like
6.5.3 追加查询条件 #addWhere #orWhere
用于拼接多个查询条件
6.5.4 过滤条件查询 #filterWhere #andFilterWhere #orFilterWhere
在参数上和
where
的相同,但会跳过变量为空值的情况
6.5.4.1 filterWhere和where的区别
where在查询变量值时,需要判断变量值是否为空,否则会出现查询空值
IS NULL
的情况
filterWhere无法查询空值的情况,不需要判断变量值是否为空
6.5.5 使用占位符,避免sql注入问题 #addParams
6.6 排序 #orderBy #addOrderBy
6.7 分组 #groupBy
6.7.1 分组条件 #having #andHaving #orHaving #filterHaving
和where的使用方式一致
6.8 分页 #Pagination #limit #offset
6.8.1 例子
contoller层
use Yii;
use yii\data\Pagination;
use yii\db\Qurraery;
public function actionTest()
{
$db01 = Yii::$app->db01; // 连接数据库
$query = new Query();
$res = $query
->from('test_my.rbid_change_info_test');
$totalCount = $res->count('*', $db01); //查询总记录数
$pages = new Pagination([
'totalCount' => $totalCount, //查询总记录数
'pageSize' => 10, //每页记录数
]);
// 获取分页查询的数据
$res = $res
->offset($pages->offset)
->limit($pages->limit)
->all($db01);
$param = [
res => $res, //结果集
pages => $pages, // 分页对象
totalCount => $totalCount,
];
return $this->render(test, $param);
}
视图层view
<!-- 分页处理 -->
<?php
if ($res) {
echo LinkPager::widget([
'pagination' => $pages,
'nextPageLabel' => '下一页',
'prevPageLabel' => '上一页',
'firstPageLabel' => '首页',
'lastPageLabel' => '尾页',
]);
}
?>
6.9 管理事务 #beginTransaction #commit #rollBack #transaction
use Yii;
$db01 = Yii::$app->db01; // 连接数据库
$transaction = $db01->beginTransaction();
$res
->createCommand($db01)
->delete('test_my.t', 'from_rbid=:from_rbid', [':from_rbid' => 11])
->execute();
// $transaction->rollBack();
$transaction->commit();
7 #表单 #form
7.1 ActiveForm组件的表单控件 #ActiveForm #todo
需要绑定model对象,自动进行validate()校验字段
如果不符合rules校验规则,则无法提交表单
推荐使用ActiveForm或者原生的html表单控件,ActiveForm控件不方便设置样式
7.1.1 例子:设置ActiveForm的样式
<?php $form = ActiveForm::begin(); ?>
<?= $form
->field($model, 'name', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '姓名', 'class' => 'col-form-label mr-4']])
->textInput(['autofocus' => true, 'placeholder' => '输入姓名', 'class' => 'form-control col-sm-2'])
?>
<?= $form
->field($model, 'email', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '邮箱', 'class' => 'col-form-label mr-4']])
->textInput(['class' => 'form-control col-sm-2', 'placeholder' => '输入邮箱'])
?>
<?=
$form
->field($model, 'textArea', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '留言', 'class' => 'col-form-label mr-4']])
->textarea(['rows' => 8, 'class' => 'col-sm-4', 'placeholder' => '输入留言'])
?>
<div class="from-group">
<input type="submit" value="submit" class='btn btn-primary'>
</div>
<?php ActiveForm::end() ?>
7.2 Html组件的表单控件
和html自己的表单控件一样,不会绑定model对象
7.2.1 方式一
7.2.2 方式二
7.2.3 #activeInput 控件和Model对象交互 #model
类似使用
Input()
函数创建控件,只是可以用model
对象的字段值填充控件
比如使用ActiveRecord
获取表的记录字段值来填充控件,或者给ActiveRecord
对象赋值(ActiveRecord
继承Model
)
7.2.3.1 例子:使用model对象字段值填充表单控件 #model
7.3 #Url
7.3.1 Url::base #base
7.3.2 Url::home,项目首页 #home
7.3.3 Url::current #current
推荐用Url::to([''])
代替Url::current()
7.3.4 Url::to,Url::toRoute #to #toRoute
7.3.4.1 例子:表单提交url
<form action="<?=Url::to(['form'])?>" class="input-group">
</form>
8 组件
8.1 面包屑 co#breadcrumbs
$this->params['breadcrumbs'][] = [label => 'Contact', url => ['/site/about']];
$this->params['breadcrumbs'][] = helllo;
$this->params['breadcrumbs'][] = abcd;
8.2 导入外部资源文件 #css #js
$this->registerJsFile('@web/js/test/test.js');
$this->registerCssFile('@web/css/test/test.css');
8.3 #Widget 自定义小部件
9 #ArrayHelper 数组工具类
9.1 获取值 #getValue #getColumn
9.2 建立映射表 #map
9.3 自定义索引 #indexq
10 控制台执行yii2脚本
在控制台执行的脚本,需要放在
commands
目录下,但无法使用Xdebugaction方法的返回值return无法输出内容,内部使用echo可以在console中输出内容