摘要:不通過日志獲取執(zhí)行的原生語句和打印變量數(shù)據(jù)打印變量數(shù)據(jù)可以這樣寫引用命名空間使用使用第二個(gè)參數(shù)是數(shù)組的深度第三個(gè)參數(shù)是是否顯示代碼高亮默認(rèn)不顯示從數(shù)據(jù)庫二維數(shù)組中返回一維數(shù)組并配合驗(yàn)證規(guī)則實(shí)現(xiàn)分類數(shù)據(jù)過濾。
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 yiihelpersVarDumper; //使用 VarDumper::dump($var); //使用2 第二個(gè)參數(shù)是數(shù)組的深度 第三個(gè)參數(shù)是是否顯示代碼高亮(默認(rèn)不顯示) VarDumper::dump($var, 10 ,true);
2、從數(shù)據(jù)庫二維數(shù)組中返回一維數(shù)組并配合rules驗(yàn)證規(guī)則實(shí)現(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();
或者:
yiihelpersArrayHelper::getColumn(Member::find()->all(), "userid") Array ( [0] => 1 [1] => 2 [2] => 3 )
返回一維數(shù)組配合驗(yàn)證規(guī)則驗(yàn)證數(shù)據(jù)正確性,如分類catid正確分為只有1-4,但是在devTools打開修改catid為5,提交同樣會(huì)到數(shù)據(jù)庫,此時(shí)rules驗(yàn)證規(guī)則如下:
["catid", "in", "range" => category::find()->select("id")->asArray()->column()],
當(dāng)然,這個(gè)也可以通過下面這樣子寫,一樣的:
["catid", "in", "range" => yiihelpersArrayHelper::getColumn(category::find()->all(), "catid")],
這樣就可以過濾不正確的分類數(shù)據(jù)了!
3、友好時(shí)間表示方法
之前一直使用自定義的友好時(shí)間函數(shù)。幾天前發(fā)現(xiàn)萬能的YII已經(jīng)提供了友好時(shí)間訪問,代碼如下:
Yii::$app->formatter->asRelativeTime("1447565922"); //2小時(shí)前
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 = yiiwebResponse::FORMAT_JSON; $items = ["some", "array", "of", "data" => ["associative", "array"]]; return $items; }
返回:
{ "0": "some", "1": "array", "2": "of", "data": ["associative", "array"] }
自定義響應(yīng)格式
讓我們創(chuàng)建一個(gè)定制的響應(yīng)格式。例子做點(diǎn)有趣和瘋狂的事我返回PHP 數(shù)組。 首先,我們需要格式化程序本身。創(chuàng)建 components/PhpArrayFormatter.php:
getHeaders()->set("Content-Type", "text/php; charset=UTF-8"); if ($response->data !== null) { $response->content = "data) . "; "; } } }
組件配置:
return [ // ... "components" => [ // ... "response" => [ "formatters" => [ "php" => "appcomponentsPhpArrayFormatter", ], ], ], ];
現(xiàn)在是準(zhǔn)備使用。在 controllers/SiteController 創(chuàng)建一個(gè)新的方法 actionTest:
public function actionTest() { Yii::$app->response->format = "php"; return [ "hello" => "world!", ]; }
返回如下:
"world!", ];
5、AR入庫前時(shí)間通過在模型重寫behaviors方法實(shí)現(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、除配置組件記錄不同級(jí)別日志外,也可以自定義在某個(gè)地方記錄LOG日志
use yiilogLogger; 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給必填項(xiàng)加星,樣式如下: div.required label:after { content: " *"; color: red; }
8、Yii2 獲取接口傳過來的 JSON 數(shù)據(jù):
接收get和post的數(shù)據(jù)很容易,那么接收json數(shù)據(jù)呢?!沒關(guān)系,看這里:
Yii::$app->request->rawBody;
9、座機(jī)和手機(jī)號(hào)碼必須填寫一個(gè):
public function rules() { return [ [["telephone", "mobile"], function ($attribute, $param) {//至少要一個(gè) if (empty($this->telephone) && empty($this->mobile)) { $this->addError($attribute, "telephone/mobile至少要填一個(gè)"); } }, "skipOnEmpty" => false], ]; }
10、where多條件查詢示例:
//and復(fù)雜示例: $time = time(); Member::find()->where(["and", ["userid" => 1, "company" =>"測(cè)試公司"], [">", "addtime", $time]]); //SELECT * FROM `member` WHERE ((`userid`=1) AND (`company`="測(cè)試公司")) AND (`addtime` > 1447587486) //and和or組合示例: $query = Member::find()->where(["and", [">","userid",2], ["or", ["company" => "深圳市新民家具有限公司"], ["address" => "深圳"]]]); //SELECT * FROM `member` WHERE (`userid` > 2) AND ((`company`="深圳市新民家具有限公司") OR (`address`="深圳"))
11、關(guān)于事務(wù):
優(yōu)雅的寫法
Yii::$app->db->transaction(function() { $order = new Order($customer); $order->save(); });
這相當(dāng)于下列冗長(zhǎng)的代碼:
$transaction = Yii::$app->db->beginTransaction(); try { $order = new Order($customer); $order->save(); $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); throw $e; }
12、rest風(fēng)格API獲取客戶端提交的get和post的數(shù)組
// post Yii::$app->request->bodyParams // get Yii::$app->request->queryParams;
13、一個(gè)控制器調(diào)用其他控制器action的方法:
方法一:
是經(jīng)典的重寫actions方法
public function actions() { return [ "error" => [ "class" => "yiiwebErrorAction", ], "captcha" => [ "class" => "yiicaptchaCaptchaAction", "fixedVerifyCode" => YII_ENV_TEST ? "testme" : null, ], ]; }
actions繼承yiibaseActions類,并重寫父類的run方法。
方法二:
site控制器如下,訪問MemberController控制器下面的index方法。 class SiteController extends Controller { public function actionIndex(){ Yii::$app->runAction("member/index", ["param"=>"123"]); } } MemberController控制器如下: class MemberController extends Controller { public function actionIndex($param = "456"){ echo "second Controller".$param; } } 訪問:http://www.yii.dev/site/index.html 輸出:second Controller123
14、點(diǎn)擊下載,如下載安卓APK文件。
public function actionDownload(){ return Yii::$app->response->setDownloadHeaders("http://xxx.com/apk/com.trade.activity.3.0.8.apk"); //return Yii::$app->response->sendFile("./com.trade.activity.3.0.8.apk"); }
15、YII模塊IP白名單設(shè)置,增加安全性
$config["modules"]["gii"] = [ "class" => "yiigiiModule", "allowedIPs" => ["127.0.0.1", "::1","10.10.1.*"], ]; $config["modules"]["debug"] = [ "class" => "yiidebugModule", "allowedIPs" => ["127.0.0.1", "::1", "192.168.0.*", "192.168.33.1"], ];
16、防止 SQL 和 Script 注入
use yiihelpersHtml; use yiihelpersHtmlPurifier; echo Html::encode($view_hello_str) //可以原樣顯示代碼 echo HtmlPurifier::process($view_hello_str) //可以過濾掉代碼
17、驗(yàn)證某個(gè)ID值是否存在
//之前一直用$model->findOne($id);exists()方法,資源節(jié)約,有沒有?! public function validateAttribute($model, $attribute) { $value = $model->$attribute; if (!Status::find()->where(["id" => $value])->exists()) { $model->addError($attribute, $this->message); } }
18、批量查詢
如查詢并循環(huán)10000條數(shù)據(jù)。一次性拿1萬條內(nèi)存會(huì)有壓力,通過批量查詢,每次拿1000條,那么內(nèi)存始終只有1000條的占有量。
foreach(Member::find()->batch(1000) as $value){ //do something //print_r(count($value)); }
19、關(guān)于CSRF驗(yàn)證
方法一:關(guān)閉Csrf,除非必要,否則不推薦
public function init(){ $this->enableCsrfValidation = false; }
方法二:普通提交,form表單中加入隱藏域
方法三:ajax異步提交,加入_csrf字段
var csrfToken = $("meta[name="csrf-token"]").attr("content"); $.ajax({ type: "POST", url: url, data: {_csrf:csrfToken}, success: success, dataType: dataType });
20、YII命令行生成數(shù)據(jù)庫文件
自動(dòng)列出可用的migrate文件
php yii migrate
從vendor/callmez/wechat/migrations目錄下生成數(shù)據(jù)表
php yii migrate --migrationPath=@callmez/wechat/migrations
從當(dāng)前應(yīng)用/migrations/db1下初始化數(shù)據(jù)到db1表
php yii migrate --migrationPath=@app/migrations/db1 --db=db1
21.關(guān)聯(lián)查詢
//客戶表Model:CustomerModel //訂單表Model:OrdersModel //國家表Model:CountrysModel //首先要建立表與表之間的關(guān)系 //在CustomerModel中添加與訂單的關(guān)系 Class CustomerModel extends yiidbActiveRecord { ... public function getOrders() { //客戶和訂單是一對(duì)多的關(guān)系所以用hasMany //此處OrdersModel在CustomerModel頂部別忘了加對(duì)應(yīng)的命名空間 //id對(duì)應(yīng)的是OrdersModel的id字段,order_id對(duì)應(yīng)CustomerModel的order_id字段 return $this->hasMany(OrdersModel::className(), ["id"=>"order_id"]); } public function getCountry() { //客戶和國家是一對(duì)一的關(guān)系所以用hasOne return $this->hasOne(CountrysModel::className(), ["id"=>"Country_id"]); } .... } // 查詢客戶與他們的訂單和國家 CustomerModel::find()->with("orders", "country")->all(); // 查詢客戶與他們的訂單和訂單的發(fā)貨地址 CustomerModel::find()->with("orders.address")->all(); // 查詢客戶與他們的國家和狀態(tài)為1的訂單 CustomerModel::find()->with([ "orders" => function ($query) { $query->andWhere("status = 1"); }, "country", ])->all();
22、yii2中關(guān)閉debug后return $this->redirect($url);不能跳轉(zhuǎn),服務(wù)器報(bào)500錯(cuò)誤。
問題分析:
1.必須 return 才能讓$this->redirect($url);立馬跳轉(zhuǎn), 而不執(zhí)行后續(xù)代碼;
2.redirect() 中指定了響應(yīng)的 http status code,默認(rèn)是302;
3.當(dāng)執(zhí)行$this->redirect($url)時(shí),不管是否在后面加return false 、return true都沒有用,還是繼續(xù)執(zhí)行完代碼。使用header("Location:$url");exit;可以解決此問題,但是,這不是yii2的邏輯,并不完美。
解決辦法:
1.在正常情況下,使用
return $this->redirect($url);
2.在解決方案1不生效時(shí),用
$this->redirect($url);Yii::$app->response->send();
3.在解決方案2不生效時(shí),用
$this->redirect($url);Yii::$app->end();
總結(jié):
用Yii::$app->end();、Yii::$app->response->send();
不管在actionXXX還是init方法都能終止代碼,而return只能在action終止代碼,是因?yàn)樵趇nit()里僅僅是代碼的執(zhí)行,return只是代碼返回。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31372.html
摘要:多入口模式,多入口分為后臺(tái)前端,微信,其他或接口對(duì)接,不同的業(yè)務(wù)不同的設(shè)備進(jìn)入不同的入口。對(duì)接微信公眾號(hào),使用了一款優(yōu)秀的微信非官方,系統(tǒng)內(nèi)已集成了該,調(diào)用方式會(huì)在文檔說明,也可直接看其文檔進(jìn)入深入開發(fā)。 RageFrame 為二次開發(fā)而生,讓開發(fā)變得更簡(jiǎn)單。 前言 RageFrame項(xiàng)目創(chuàng)建于2016年4月16日,基于Yii2框架開發(fā)的應(yīng)用開發(fā)引擎,目前正在成長(zhǎng)中,目的是為了集成更多...
摘要:極致的插件機(jī)制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會(huì)對(duì)原來的系統(tǒng)產(chǎn)生影響強(qiáng)大的功能完全滿足各階段的需求,支持用戶多端訪問后臺(tái)微信前臺(tái)等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺(tái)前端,微信,對(duì)內(nèi)接口,對(duì)外接口,不同的業(yè)務(wù),不同的設(shè)備,進(jìn)入不同的入口。 RageFrame 2.0 為二次開發(fā)而生,讓開發(fā)變得更簡(jiǎn)單 項(xiàng)目地址:https://github.com/jianyan74/... 前言 這...
摘要:極致的插件機(jī)制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會(huì)對(duì)原來的系統(tǒng)產(chǎn)生影響強(qiáng)大的功能完全滿足各階段的需求,支持用戶多端訪問后臺(tái)微信前臺(tái)等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺(tái)前端,微信,對(duì)內(nèi)接口,對(duì)外接口,不同的業(yè)務(wù),不同的設(shè)備,進(jìn)入不同的入口。 RageFrame 2.0 為二次開發(fā)而生,讓開發(fā)變得更簡(jiǎn)單 項(xiàng)目地址:https://github.com/jianyan74/... 前言 這...
摘要:本文簡(jiǎn)要回顧相關(guān)概念和用法。相比之下已是明日黃花。分別對(duì)應(yīng)的命令是根據(jù)關(guān)鍵字查找依賴包,例如查找本人發(fā)布的包。作為目前包依賴管理的最佳工具,值得每一位開發(fā)人員掌握。 轉(zhuǎn)載請(qǐng)注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) session 數(shù)據(jù)庫操作 加解密 Composer是PHP...
閱讀 3326·2021-11-19 11:36
閱讀 2927·2021-09-27 13:34
閱讀 1990·2021-09-22 15:17
閱讀 2404·2019-08-30 13:49
閱讀 754·2019-08-26 13:58
閱讀 1359·2019-08-26 10:47
閱讀 2538·2019-08-23 18:05
閱讀 600·2019-08-23 14:25