国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

YII2項(xiàng)目常用技能知識(shí)總結(jié)

W_BinaryTree / 3488人閱讀

摘要:不通過日志獲取執(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

相關(guān)文章

  • 基于Yii2的應(yīng)用開發(fā)引擎RageFrame

    摘要:多入口模式,多入口分為后臺(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)中,目的是為了集成更多...

    enda 評(píng)論0 收藏0
  • RageFrame 一個(gè) Yii2 + AdminLET 免費(fèi)開源多商戶通用后臺(tái)管理系統(tǒ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/... 前言 這...

    sunny5541 評(píng)論0 收藏0
  • RageFrame 一個(gè) Yii2 + AdminLET 免費(fèi)開源多商戶通用后臺(tái)管理系統(tǒ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/... 前言 這...

    Ali_ 評(píng)論0 收藏0
  • PHP回顧之Composer

    摘要:本文簡(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...

    Ocean 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<