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
坏狼php学习 计数器实例代码
Jun 15 PHP
30 个很棒的PHP开源CMS内容管理系统小结
Oct 14 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
Nov 27 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
PHP中PDO的事务处理分析
Apr 07 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
PHP创建单例后台进程的方法示例
May 23 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新手上路(三)
2006/10/09 PHP
一个好用的分页函数
2006/11/16 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
javascript中match函数的用法小结
2014/02/08 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Django教程笔记之中间件middleware详解
2018/08/01 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
技校毕业生的自我评价
2013/12/27 职场文书
教育技术职业规划范文
2014/03/04 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
先进党支部事迹材料
2014/12/24 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
canvas实现贪食蛇的实践
2022/02/15 Javascript