在學(xué)習(xí)YII和使用的過程中,總結(jié)了一些技能知識點,方便自己的記憶。這里分享給大家。
1、不通過日志獲取AR執(zhí)行的原生SQL語句和打印變量數(shù)據(jù)
$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();
打印變量數(shù)據(jù)可以這樣寫://引用命名空間use yii\helpers\VarDumper;//使用
VarDumper::dump($var);//使用2 第二個參數(shù)是數(shù)組的深度 第三個參數(shù)是是否顯示代碼高亮(默認(rèn)不顯示)
VarDumper::dump($var, 10 ,true);
2、從數(shù)據(jù)庫二維數(shù)組中返回一維數(shù)組并配合rules驗證規(guī)則實現(xiàn)分類數(shù)據(jù)過濾。
普通返回表記錄的二維數(shù)組
Member::find()->select('userid')->asArray()->all();
Array
(
[0] => Array
(
[userid] => 1
)
[1] => Array
(
[userid] => 2
)
[2] => Array
(
[userid] => 3
)
)
返回字段的一維數(shù)組
Member::find()->select('userid')->asArray()->column();
或者:
\yii\helpers\ArrayHelper::getColumn(Member::find()->all(), 'userid')
Array
(
[0] => 1
[1] => 2
[2] => 3
)
返回一維數(shù)組配合驗證規(guī)則驗證數(shù)據(jù)正確性,如分類catid正確分為只有1-4,但是在devTools打開修改catid為5,提交同樣會到數(shù)據(jù)庫,此時rules驗證規(guī)則如下:
['catid', 'in', 'range' => category::find()->select('id')->asArray()->column()],
當(dāng)然,這個也可以通過下面這樣子寫,一樣的:
['catid', 'in', 'range' => \yii\helpers\ArrayHelper::getColumn(category::find()->all(), 'catid')],
這樣就可以過濾不正確的分類數(shù)據(jù)了!
3、友好時間表示方法
之前一直使用自定義的友好時間函數(shù)。幾天前發(fā)現(xiàn)萬能的YII已經(jīng)提供了友好時間訪問,代碼如下:
Yii::$app->formatter->asRelativeTime('1447565922'); //2小時前
4、使用不同的響應(yīng)類型或者自定義響應(yīng)類型
有效的格式:
FORMAT_RAW
FORMAT_HTML
FORMAT_JSON
FORMAT_JSONP
FORMAT_XML
JSON響應(yīng)
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"]
}
自定義響應(yīng)格式
讓我們創(chuàng)建一個定制的響應(yīng)格式。例子做點有趣和瘋狂的事我返回PHP 數(shù)組。 首先,我們需要格式化程序本身。創(chuàng)建 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',
],
],
],
];
現(xiàn)在是準(zhǔn)備使用。在 controllers/SiteController 創(chuàng)建一個新的方法 actionTest:
public function actionTest()
{
Yii::$app->response->format = 'php';
return [
'hello' => 'world!',
];
}
返回如下:
<?phpreturn [
'hello' => 'world!',
];
5、AR入庫前時間通過在模型重寫behaviors方法實現(xiàn)優(yōu)雅入庫方式。
如下:
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標(biāo)簽
//方法一,通過ActiveForm類
$form->field($model, '字段名')->passwordInput(['maxlength' => true])->label(false) ?>
//方法二,通過 HTML類
Html::activeInput($type,$model,'字段名')
Yii2給必填項加星,樣式如下:
div.required label:after {
content: " *";
color: red;
}
原文來自:博客園/sandea