欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

YII2项目常用技能知识总结

发布时间:2016-08-06 22:08  回复:0  查看:3101   最后回复:2016-08-06 22:08  

学习YII和使用的过程中,总结了一些技能知识点,方便自己的记忆。这里分享给大家。

 

1、不通过日志获取AR执行的原生SQL语句和打印变量数据

$query = User::find() ->select(['username'])->where(['id'=>[1,2,3,4])// get the AR raw sql in YII2

$commandQuery = clone $query;echo $commandQuery->createCommand()->getRawSql();$users = $query->all();

打印变量数据可以这样写://引用命名空间use yii\helpers\VarDumper;//使用

VarDumper::dump($var);//使用2  第二个参数是数组的深度  第三个参数是是否显示代码高亮(默认不显示)

VarDumper::dump($var, 10 ,true);

2、从数据库二维数组中返回一维数组并配合rules验证规则实现分类数据过滤。

普通返回表记录的二维数组

Member::find()->select('userid')->asArray()->all();

Array

(

    [0] => Array

        (

            [userid] => 1

        )

 

    [1] => Array

        (

            [userid] => 2

        )

 

    [2] => Array

        (

            [userid] => 3

        )

 

)

返回字段的一维数组

Member::find()->select('userid')->asArray()->column();

或者:

\yii\helpers\ArrayHelper::getColumn(Member::find()->all(), 'userid')

Array

(

    [0] => 1

    [1] => 2

    [2] => 3

)

返回一维数组配合验证规则验证数据正确性,如分类catid正确分为只有1-4,但是在devTools打开修改catid5,提交同样会到数据库,此时rules验证规则如下:

['catid', 'in', 'range' => category::find()->select('id')->asArray()->column()],

当然,这个也可以通过下面这样子写,一样的:

['catid', 'in', 'range' => \yii\helpers\ArrayHelper::getColumn(category::find()->all(), 'catid')],

这样就可以过滤不正确的分类数据了!

3、友好时间表示方法

之前一直使用自定义的友好时间函数。几天前发现万能的YII已经提供了友好时间访问,代码如下:

Yii::$app->formatter->asRelativeTime('1447565922'); //2小时前

4、使用不同的响应类型或者自定义响应类型

有效的格式:

 

FORMAT_RAW

 

 

FORMAT_HTML

 

 

FORMAT_JSON

 

 

FORMAT_JSONP

 

 

FORMAT_XML

 

JSON响应

public function actionIndex()

{

    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

    $items = ['some', 'array', 'of', 'data' => ['associative', 'array']];

    return $items;

}

返回:

{

    "0": "some",

    "1": "array",

    "2": "of",

    "data": ["associative", "array"]

}

自定义响应格式

让我们创建一个定制的响应格式。例子做点有趣和疯狂的事我返回PHP 数组。 首先,我们需要格式化程序本身。创建 components/PhpArrayFormatter.php

<?phpnamespace app\components;use yii\helpers\VarDumper;use yii\web\ResponseFormatterInterface;class PhpArrayFormatter implements ResponseFormatterInterface

{

    public function format($response)

    {

        $response->getHeaders()->set('Content-Type', 'text/php; charset=UTF-8');

        if ($response->data !== null) {

            $response->content = "<?php\nreturn " . VarDumper::export($response->data) . ";\n";

        }

    }

}

组件配置:

return [

    // ...

    'components' => [

        // ...

        'response' => [

            'formatters' => [

                'php' => 'app\components\PhpArrayFormatter',

            ],

        ],

    ],

];

现在是准备使用。在 controllers/SiteController 创建一个新的方法 actionTest:

public function actionTest()

{

    Yii::$app->response->format = 'php';

    return [

        'hello' => 'world!',

    ];

}

返回如下:

<?phpreturn [

    'hello' => 'world!',

];

5AR入库前时间通过在模型重写behaviors方法实现优雅入库方式。

如下:

public function behaviors()

{

    return [

        'timestamp' => [

            'class' => TimestampBehavior::className(),

            'attributes' => [

                ActiveRecord::EVENT_BEFORE_INSERT => 'creation_time',

                ActiveRecord::EVENT_BEFORE_UPDATE => 'update_time',

            ],

            'value' => function() { return date('U'); // unix timestamp },

        ],

    ];

}

6、除配置组件记录不同级别日志外,也可以自定义在某个地方记录LOG日志

use yii\log\Logger;

\Yii::getLogger()->log('User has been created', Logger::LEVEL_INFO);

7 ActiveForm类不让生成label标签

//方法一,通过ActiveForm

$form->field($model, '字段名')->passwordInput(['maxlength' => true])->label(false) ?>

//方法二,通过 HTML

Html::activeInput($type,$model,'字段名')

Yii2给必填项加星,样式如下:

div.required label:after {

    content: " *";

    color: red;

}

 

 

原文来自:博客园/sandea

您还未登录,请先登录

热门帖子

最新帖子