分类目录归档:Yii2

YII2 数据缓存的使用

$data = $cache->get($key);

if ($data === false) {

    // $data 在缓存中没有找到,则重新计算它的值
    // 将 $data 存放到缓存供下次使用
    $cache->set($key, $data);
}



从 2.0.11 版本开始, 缓存组件 提供了 getOrSet() 方法来简化数据的取回、计算和存储。 下面的代码逻辑和上一个例子是完全一样的:

$data = $cache->getOrSet($key, function () {
    return $this->calculateSomething();
});
当缓存中有关联 $key 的数据时,将返回这个缓存的值。 否则就执行匿名函数来计算出将要缓存的数据并返回它。
如果匿名函数需要作用域外的数据时,可以使用 use 语句把这些数据传递到匿名函数中。 例如:

$user_id = 42;
$data = $cache->getOrSet($key, function () use ($user_id) {
    return $this->calculateSomething($user_id);
});
0

YII2 ArrayHelper常用方法

$data = [
            ['age' => 30, 'name' => 'Alexander'],
            ['age' => 30, 'name' => 'Brian'],
            ['age' => 19, 'name' => 'Barney'],
        ];
        /**
         * 多维排序
         */
        ArrayHelper::multisort($data, ['age', 'name'], [SORT_ASC, SORT_DESC]);

        /**
         * 测试阵列
         */
        var_dump(ArrayHelper::isIn('a', ['a']));
        var_dump(ArrayHelper::isIn('a', ['a']));
        var_dump(ArrayHelper::isSubset(['a', 'c'], ['a', 'b', 'c']));

        $posts = Sample::find()->all();
        $arr = ArrayHelper::toArray($posts,[
            'common\models\Sample'=>[
                'c1',
                'c2'=>'c3',
            ]
        ]);

        var_dump($arr);


        $array = [
            ['id' => '123', 'name' => 'aaa', 'class' => 'x'],
            ['id' => '123', 'name' => 'bbb', 'class' => 'x'],
            ['id' => '345', 'name' => 'ccc', 'class' => 'y'],
        ];

        $result1 = ArrayHelper::map($array, 'id', 'name');
        $result2 = ArrayHelper::map($array, 'id', 'name', 'class');
        var_dump($result1);
        var_dump($result2);


        $r1 = ArrayHelper::index($array,'id');
        //以ID为索引,相同的ID后面将覆盖前面的
        print_r($r1);

        $r2 = ArrayHelper::index($array,null,'id');
        print_r($r2);
        //以ID为索引相同的ID不会被覆盖,而是合并成一个数组

        $r3 = ArrayHelper::index($array,'class',[function($ele){
            return $ele['id'];
        },'name']);

        //以三级分组索引 id -> name -> class

        print_r($r3);
0

Yii2获取原始的POST数据

由于最近手头项目需要进行跨团队合作,联合调试自然是少不了,出现了很多令人崩溃的问题。合作团队在外地,沟通基本是微信加截图,带来了很多问题。有些问题甚至不清楚到底是对方的问题,还是我方的Bug。
昨天出现了一个奇怪的问题,对方调我们的接口数据产生了截断了,还产生了很多非法字符,以至于无法顺利的解析。正常情况下,这个接口是测试通过的。但不知道是平台兼容性问题,还是序列话出错,某些情况下就是无法提交。总之让人一时找不着北。我们也尝试了转码和替换,但都没有达到满意的效果。对方也是炸掉了,束手无策。
这种山高路远的,我也不想把自己送往人生地不熟的地方跟他们当面对接,只好自己想办法解决问题。最终勉强可以接受了正确的数据格式。

$rawBodyStr = Yii::$app->request->getRawBody();//Yii2获取原如的post提交数据
parse_str($rawBodyStr,$arrRes);//拆解变量生成数组
$params =$arrRes['params'];
---
这段为解析base64数据
$replaces = array(' ' => '+' );
$winNumberDecode = base64_decode(strtr($result['WinNumber'],$replaces),1);//将转码生成的空格再替换回加号
0

Yii2 搜索模型的使用

在后台项目中几乎一直要用到对于列表页的数据进行筛选排序。如果筛选条件比较多的情况下,还是建议写一个搜索模型。到时候改的时候也比较方便。

<?php
/**
 * Created by PhpStorm.
 * User: damon
 * Date: 2018/10/30
 * Time: 6:16 PM
 */

namespace backend\models;


use common\helpers\Tools;
use common\models\UserComplaints;
use yii\data\ActiveDataProvider;

class UserComplaintsSearch extends UserComplaints
{
    public $timeKey;
    public $startTime;
    public $endTime;

    public function rules()
    {
        return [
            [['timeKey','startTime','endTime'],'safe']
        ];
    }


    public function search($params){
        $query = UserComplaints::find();
        $dataProvider = new ActiveDataProvider([
            'query'=>$query,
            'pagination'=>[
                'pageSize'=>50,
            ],
            'sort'=>[
                'defaultOrder'=>[
                    'id'=>SORT_DESC
                ],
            ]
        ]);
        if(!$this->load($params,'')&&$this->validate()){
            return $dataProvider;
        }

        switch ($this->timeKey){
            case 'today':
                $query->andWhere(['between','created_time',date('Y-m-d'),date('Y-m-d',strtotime('+1 days'))]);
                break;
            case 'week':
                $startTime = Tools::getWeekStart();
                $query->andWhere(['between','created_time',$startTime,date('Y-m-d',strtotime('+1 days'))]);
                break;
            case 'month':
                $startTime = Tools::getMonthStart();
                $query->andWhere(['between','created_time',$startTime,date('Y-m-d',strtotime('+1 days'))]);
                break;
            default:
                break;
        }

        if(!empty($this->startTime)&&!empty($this->endTime)){
            $query->andWhere(['between','created_time',$this->startTime,date('Y-m-d',strtotime("+1 days",strtotime($this->endTime)))]);
        }
        return $dataProvider;
    }
}

在控制器中只需要将传过来的参数load进去就可以了

$searchModel = new UserComplaintsSearch();
$dataProvider = $searchModel->search(Yii::$app->request->get());
return $this->render('complaints',['models'=>$dataProvider->getModels()]);
0

Yii2生成前台URL链接

1.配置

'urlManagerFrontend' => [
            'class'               => 'yii\web\UrlManager',
            'hostInfo'            => $params['domain']['frontend'],//http://www.test.com
            'enablePrettyUrl'     => true,
            'showScriptName'      => false,
            'enableStrictParsing' => false,
            'rules'               => [],
        ],

2.view中使用

echo   Yii::$app->urlManagerFrontend->createAbsoluteUrl(['mobile/store/index','id'=>101]);
//http://www.test.com/mobile/store/index?id=101
0

Yii2设置URL美化(Apache)

1.在对应模块下的web目录下创建.htaccess文件,输入以下代码:

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

2.修改配置文件

'components' => [
    // ...
    'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Hide index.php
        'showScriptName' => false,
        // Use pretty URLs
        'enablePrettyUrl' => true,
        'rules' => [
        ],
    ],
    // ...
],
0

Yii2 设置title

Controller:
public funtion actionIndex() {
        $this->getView()->title = "your title";
        return $this->render('index');
}

View:
<title><?= Html::encode($this->title) ?></title>

0