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中如何直接执行SHELL
Jun 28 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
PHP中cookie和session的区别实例分析
Aug 28 PHP
phpmyadmin中禁止外网使用的方法
Nov 04 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
PHP开发Apache服务器配置
Jul 15 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
PHP实现非阻塞模式的方法分析
Jul 26 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 PHP
PHP大文件分块上传功能实例详解
Jul 22 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 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
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
python 字符串格式化的示例
2020/09/21 Python
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
汇集了世界上最好的天然和有机美容产品:LoveLula
2018/02/05 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
Shell编程面试题
2012/05/30 面试题
Delphi笔试题
2016/11/14 面试题
办公室内勤岗位职责范本
2013/12/09 职场文书
财务管理制度范本
2015/08/04 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers