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:风雨欲来 路在何方?
Oct 09 PHP
如何开发一个虚拟域名系统
Oct 09 PHP
解析php中获取系统信息的方法
Jun 25 PHP
php对csv文件的读取,写入,输出下载操作详解
Aug 10 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php统计文章排行示例
Mar 04 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
php导入大量数据到mysql性能优化技巧
Dec 29 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
php 使用 __call实现重载功能示例
Nov 18 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中static关键字原理的学习研究分析
2011/07/18 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
在JavaScript中获取请求的URL参数[正则]
2010/12/25 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
Active控件问题小结(附解决办法)
2016/06/09 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
Python 文件和输入输出小结
2013/10/09 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
简单谈谈Python中的闭包
2016/11/30 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
继电保护工岗位职责
2014/01/05 职场文书
环境建议书
2015/02/04 职场文书
开学第一周总结
2015/07/16 职场文书
教师旷工检讨书
2015/08/15 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
合作协议书格式范本
2016/03/21 职场文书
通知怎么写?
2019/04/17 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书