YII框架常用技巧总结


Posted in PHP onApril 27, 2019

本文实例总结了YII框架常用技巧。分享给大家供大家参考,具体如下:

获取当前Controller name和action name(在控制器里面使用)

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 注入:

use yii\helpers\Html;
use yii\helpers\HtmlPurifier;
echo Html::encode($view_hello_str) //可以原样显示<script></script>代码
echo HtmlPurifier::process($view_hello_str) //可以过滤掉<script></script>代码

大于、小于条件查询

// SELECT * FROM `order` WHERE `subtotal` > 200 ORDER BY `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');

方式二:

return User::find()->select('name')->asArray()->column();

打印数据:

// 引用命名空间
use yii\helpers\VarDumper;
// 使用
VarDumper::dump($var);
// 使用2 第二个参数是数组的深度 第三个参数是是否显示代码高亮(默认不显示)
VarDumper::dump($var, 10 ,true);die;

表单验证,只要需要一个参数:

public function rules()
{
  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],
  ];
}

SQL is not null条件查询

// ['not' => ['attribute' => null]]
//['ISNULL(`attribute`)'=>true]
$query = new Query;
$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 是否存在

public function rules()
{
  return [
    [['point_template_id'], 'exist',
      'targetClass' => PointTemplate::className(),
      'targetAttribute' => 'id',
      'message' => '此{attribute}不存在。'
    ],
  ];
}

Yii给必填项加星

div . required label:after {
  content:
  " *";
  color:
  red;
}

执行SQL查询并缓存结果

$styleId = Yii::$app->request->get('style');
$collection = Yii::$app->db->cache(function ($db) use ($styleId) {
  return Collection::findOne(['style_id' => $styleId]);
}, self::SECONDS_IN_MINITUE * 10);

场景:

数据库有user表有个avatar_path字段用来保存用户头像路径

需求: 头像url需要通过域名http://b.com/作为基本url

目标: 提高代码复用

此处http://b.com/可以做成一个配置

示例:

User.php

class User extends \yii\db\ActiveRecord
{
...
  public function extraFields()
  {
    $fields = parent::extraFields();
    $fields['avatar_url'] = function () {
      return empty($this->avatar_path) ? '可以设置一个默认的头像地址' : 'http://b.com/' . $this->avatar_path;
    };
    return $fields;
  }
...
}

ExampleController.php

class ExampleController extends \yii\web\Controller
{
  public function actionIndex()
  {
    $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' => 'The combination of Store ID and Member Name has already been taken.'],

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 的值

表单验证,去除首尾空格:

public function rules()
{
  return [[title', 'content'],'trim']];
}

单独为某个Action关闭 Csrf 验证

新建一个Behavior

use Yii;
use yii\base\Behavior;
use yii\web\Controller;
class NoCsrf extends Behavior
{
  public $actions = [];
  public $controller;
  public function events()
  {
    return [Controller::EVENT_BEFORE_ACTION => 'beforeAction'];
  }
  public function beforeAction($event)
  {
    $action = $event->action->id;
    if (in_array($action, $this->actions)) {
      $this->controller->enableCsrfValidation = false;
    }
  }
}

然后在Controller中添加Behavior

public function behaviors()
{
  return [
    'csrf' => [
      'class' => NoCsrf::className(),
      'controller' => $this,
      'actions' => [
        'action - name'
      ]
    ]
  ];
}

LIKE 查询 单边加 %

['like', 'name', 'tester'] 会生成 name LIKE ' % tester % '。
['like', 'name', ' % tester', false] => name LIKE ' % tester'
$query = User::find()->where(['LIKE', 'name', $id . ' % ', false]);

SQL 随机抽取十名幸运用户

$query = new Query;
$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 = new Order($customer);
  $order->save();
  $order->addItems($items);
});
// 这相当于下列冗长的代码:
$transaction = Yii::$app->db->beginTransaction();
try {
  $order = new Order($customer);
  $order->save();
  $order->addItems($items);
  $transaction->commit();
} catch (\Exception $e) {
  $transaction->rollBack();
  throw $e;
}

批量插入数据

第一种方法

$model = new User();
foreach ($data as $attributes) {
  $_model = clone $model;
  $_model->setAttributes($attributes);
  $_model->save();
}

第二种方法

$model = new User();
foreach ($data as $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'); //get parameter 'id'

获取(除域名外的)首页地址

# /public/index.php
Yii::$app->user->returnUrl;

获取Referer

Yii::$app->request->headers['Referer']

或者

Yii::$app->getRequest()->getReferrer()

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
php 判断网页是否是utf8编码的方法
Jun 06 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
PHP+Ajax实现验证码的实时验证
Jul 20 PHP
laravel中命名路由的使用方法
Feb 24 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
php无限级评论嵌套实现代码
Apr 18 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 PHP
YII框架行为behaviors用法示例
Apr 26 #PHP
YII框架模块化处理操作示例
Apr 26 #PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 #PHP
YII框架实现自定义第三方扩展操作示例
Apr 26 #PHP
PHP中PCRE正则解析代码详解
Apr 26 #PHP
通过PHP设置BugFree获取邮箱通知
Apr 25 #PHP
PHP实现字符串的全排列详解
Apr 24 #PHP
You might like
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
js实现自定义进度条效果
2017/03/15 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
C#面试题问题集
2016/04/02 面试题
服装设计专业自荐信
2014/06/17 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
新学期开学寄语2016
2015/12/04 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers