YII框架常用技巧总结
本文实例总结了YII框架常用技巧。分享给大家供大家参考,具体如下:
获取当前Controllername和actionname(在控制器里面使用)
echo$this->id; echo$this->action->id;
控制器获取当前模块
$this->module->id
不生成label标签
//ActiveForm类 $form->field($model,'字段名')->passwordInput(['maxlength'=>true])->label(false)
Yii2获取接口传过来的JSON数据:
Yii::$app->request->rawBody;
防止SQL和Script注入:
useyii\helpers\Html; useyii\helpers\HtmlPurifier; echoHtml::encode($view_hello_str)//可以原样显示代码 echoHtmlPurifier::process($view_hello_str)//可以过滤掉代码
大于、小于条件查询
//SELECT*FROM`order`WHERE`subtotal`>200ORDERBY`id`
$orders=$customer->getOrders()
->where(['>','subtotal',200])
->orderBy('id')
->all();
搜索的时候添加条件筛选
$dataProvider=$searchModel->search(Yii::$app->request->queryParams); //$dataProvider->query->andWhere(['pid'=>0]); $dataProvider->query->andWhere(['>','pid',0]); //可选传参 $dataProvider->query->andFilterWhere(['id'=>isset($id)?$id:null]);
有两种方式获取查询出来的name为数组的集合[name1,name2,name3]:
方式一:
return\yii\helpers\ArrayHelper::getColumn(User::find()->all(),'name');
方式二:
returnUser::find()->select('name')->asArray()->column();
打印数据:
//引用命名空间 useyii\helpers\VarDumper; //使用 VarDumper::dump($var); //使用2第二个参数是数组的深度第三个参数是是否显示代码高亮(默认不显示) VarDumper::dump($var,10,true);die;
表单验证,只要需要一个参数:
publicfunctionrules()
{
return[
[['card_id','card_code'],function($attribute,$param){//至少要一个
if(empty($this->card_code)&&empty($this->card_id)){
$this->addError($attribute,'card_id/card_code至少要填一个');
}
},'skipOnEmpty'=>false],
];
}
SQLisnotnull条件查询
//['not'=>['attribute'=>null]]
//['ISNULL(`attribute`)'=>true]
$query=newQuery;
$query->select('ID,City,State,StudentName')
->from('student')
->where(['IsActive'=>1])
->andWhere(['not',['City'=>null]])
->andWhere(['not',['State'=>null]])
->orderBy(['rand()'=>SORT_DESC])
->limit(10);
校验point_template_id在PointTemplate是否存在
publicfunctionrules()
{
return[
[['point_template_id'],'exist',
'targetClass'=>PointTemplate::className(),
'targetAttribute'=>'id',
'message'=>'此{attribute}不存在。'
],
];
}
Yii给必填项加星
div.requiredlabel:after{
content:
"*";
color:
red;
}
执行SQL查询并缓存结果
$styleId=Yii::$app->request->get('style');
$collection=Yii::$app->db->cache(function($db)use($styleId){
returnCollection::findOne(['style_id'=>$styleId]);
},self::SECONDS_IN_MINITUE*10);
场景:
数据库有user表有个avatar_path字段用来保存用户头像路径
需求:头像url需要通过域名http://b.com/作为基本url
目标:提高代码复用
此处http://b.com/可以做成一个配置
示例:
User.php
classUserextends\yii\db\ActiveRecord
{
...
publicfunctionextraFields()
{
$fields=parent::extraFields();
$fields['avatar_url']=function(){
returnempty($this->avatar_path)?'可以设置一个默认的头像地址':'http://b.com/'.$this->avatar_path;
};
return$fields;
}
...
}
ExampleController.php
classExampleControllerextends\yii\web\Controller
{
publicfunctionactionIndex()
{
$userModel=User::find()->one();
$userData=$userModel->toArray([],['avatar_url']);
echo$userData['avatar_url'];//输出内容:http://b.com/头像路径
}
}
Model里面rules联合唯一规则
[['store_id','member_name'],'unique','targetAttribute'=>['store_id','member_name'],'message'=>'ThecombinationofStoreIDandMemberNamehasalreadybeentaken.'],
Model多个字段一条规则不同提示
[['name','email','subject','body'],'required','message'=>'{attribute}必须'],
标量查询
Post::find()->select('title')->where(['user_id'=>$userId])->scalar();
生成SQL:
SELECT`title`FROM`post`WHERE`user_id`=1
直接输出title的值。
如果select('title')不写的话,生成SQL是:
`SELECT*FROM`post`WHERE`user_id`=1`
直接输出id的值
表单验证,去除首尾空格:
publicfunctionrules()
{
return[[title','content'],'trim']];
}
单独为某个Action关闭Csrf验证
新建一个Behavior
useYii;
useyii\base\Behavior;
useyii\web\Controller;
classNoCsrfextendsBehavior
{
public$actions=[];
public$controller;
publicfunctionevents()
{
return[Controller::EVENT_BEFORE_ACTION=>'beforeAction'];
}
publicfunctionbeforeAction($event)
{
$action=$event->action->id;
if(in_array($action,$this->actions)){
$this->controller->enableCsrfValidation=false;
}
}
}
然后在Controller中添加Behavior
publicfunctionbehaviors()
{
return[
'csrf'=>[
'class'=>NoCsrf::className(),
'controller'=>$this,
'actions'=>[
'action-name'
]
]
];
}
LIKE查询单边加%
['like','name','tester']会生成nameLIKE'%tester%'。 ['like','name','%tester',false]=>nameLIKE'%tester' $query=User::find()->where(['LIKE','name',$id.'%',false]);
SQL随机抽取十名幸运用户
$query=newQuery;
$query->select('ID,City,State,StudentName')
->from('student')
->where(['IsActive'=>1])
->andWhere(['not',['State'=>null]])
->orderBy(['rand()'=>SORT_DESC])
->limit(10);
关于事务:
Yii::$app->db->transaction(function(){
$order=newOrder($customer);
$order->save();
$order->addItems($items);
});
//这相当于下列冗长的代码:
$transaction=Yii::$app->db->beginTransaction();
try{
$order=newOrder($customer);
$order->save();
$order->addItems($items);
$transaction->commit();
}catch(\Exception$e){
$transaction->rollBack();
throw$e;
}
批量插入数据
第一种方法
$model=newUser();
foreach($dataas$attributes){
$_model=clone$model;
$_model->setAttributes($attributes);
$_model->save();
}
第二种方法
$model=newUser();
foreach($dataas$attributes){
$model->isNewRecord=true;
$model->setAttributes($attributes);
$model->save()&&$model->id=0;
}
URL操作
获取url中的host信息
Yii::$app->request->getHostInfo()
获取url中的路径信息(不包含host和参数):
Yii::$app->request->getPathInfo()
获取不包含host信息的url(含参数):
#/public/index.php?r=news&id=1 Yii::$app->request->url
或者
Yii::$app->request->requestUri
只想获取url中的参数部分
#r=news&id=1 Yii::$app->getRequest()->queryString;
获取某个参数的值,比如id
Yii::$app->getRequest()->getQuery('id');//getparameter'id'
获取(除域名外的)首页地址
#/public/index.php Yii::$app->user->returnUrl;
获取Referer
Yii::$app->request->headers['Referer']
或者
Yii::$app->getRequest()->getReferrer()
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。