在学习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打开修改catid为5,提交同样会到数据库,此时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!',
];
5、AR入库前时间通过在模型重写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