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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。