成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

YII2項目常用技能知識總結(jié)

W_BinaryTree / 3498人閱讀

摘要:不通過日志獲取執(zhí)行的原生語句和打印變量數(shù)據(jù)打印變量數(shù)據(jù)可以這樣寫引用命名空間使用使用第二個參數(shù)是數(shù)組的深度第三個參數(shù)是是否顯示代碼高亮默認不顯示從數(shù)據(jù)庫二維數(shù)組中返回一維數(shù)組并配合驗證規(guī)則實現(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  第二個參數(shù)是數(shù)組的深度  第三個參數(shù)是是否顯示代碼高亮(默認不顯示)
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();

或者:

yiihelpersArrayHelper::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()],

當然,這個也可以通過下面這樣子寫,一樣的:

["catid", "in", "range" => yiihelpersArrayHelper::getColumn(category::find()->all(), "catid")],

這樣就可以過濾不正確的分類數(shù)據(jù)了!

3、友好時間表示方法

之前一直使用自定義的友好時間函數(shù)。幾天前發(fā)現(xiàn)萬能的YII已經(jīng)提供了友好時間訪問,代碼如下:

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 = yiiwebResponse::FORMAT_JSON;
        $items = ["some", "array", "of", "data" => ["associative", "array"]];
        return $items;
    }

返回:

    {
        "0": "some",
        "1": "array",
        "2": "of",
        "data": ["associative", "array"]
    }

自定義響應格式

讓我們創(chuàng)建一個定制的響應格式。例子做點有趣和瘋狂的事我返回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)在是準備使用。在 controllers/SiteController 創(chuàng)建一個新的方法 actionTest:

public function actionTest()
    {
        Yii::$app->response->format = "php";
        return [
            "hello" => "world!",
        ];
    }

返回如下:

     "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 yiilogLogger;
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;
}

8、Yii2 獲取接口傳過來的 JSON 數(shù)據(jù):

接收get和post的數(shù)據(jù)很容易,那么接收json數(shù)據(jù)呢?!沒關系,看這里:

Yii::$app->request->rawBody;
9、座機和手機號碼必須填寫一個:

public function rules()
{
    return [
        [["telephone", "mobile"], function ($attribute, $param) {//至少要一個
            if (empty($this->telephone) && empty($this->mobile)) {
                $this->addError($attribute, "telephone/mobile至少要填一個");
            }
        }, "skipOnEmpty" => false],
    ];
}

10、where多條件查詢示例:

//and復雜示例:
$time = time();
Member::find()->where(["and", ["userid" => 1, "company" =>"測試公司"], [">", "addtime", $time]]);
//SELECT * FROM `member` WHERE ((`userid`=1) AND (`company`="測試公司")) 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、關于事務:

優(yōu)雅的寫法

Yii::$app->db->transaction(function() {
    $order = new Order($customer);
    $order->save();
});

這相當于下列冗長的代碼:

$transaction = Yii::$app->db->beginTransaction();
try {
    $order = new Order($customer);
    $order->save();
    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollBack();
    throw $e;
}

12、rest風格API獲取客戶端提交的get和post的數(shù)組

// post
Yii::$app->request->bodyParams
// get
Yii::$app->request->queryParams;

13、一個控制器調(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、點擊下載,如下載安卓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白名單設置,增加安全性

$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、驗證某個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)存會有壓力,通過批量查詢,每次拿1000條,那么內(nèi)存始終只有1000條的占有量。

foreach(Member::find()->batch(1000) as $value){
    //do something
    //print_r(count($value));
}

19、關于CSRF驗證

方法一:關閉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ù)庫文件

自動列出可用的migrate文件

php yii migrate

從vendor/callmez/wechat/migrations目錄下生成數(shù)據(jù)表

php yii migrate --migrationPath=@callmez/wechat/migrations

從當前應用/migrations/db1下初始化數(shù)據(jù)到db1表

php yii migrate --migrationPath=@app/migrations/db1 --db=db1

21.關聯(lián)查詢

//客戶表Model:CustomerModel 
//訂單表Model:OrdersModel
//國家表Model:CountrysModel
//首先要建立表與表之間的關系 
//在CustomerModel中添加與訂單的關系
      
Class CustomerModel extends yiidbActiveRecord
{
    ...
    
    public function getOrders()
    {
        //客戶和訂單是一對多的關系所以用hasMany
        //此處OrdersModel在CustomerModel頂部別忘了加對應的命名空間
        //id對應的是OrdersModel的id字段,order_id對應CustomerModel的order_id字段
        return $this->hasMany(OrdersModel::className(), ["id"=>"order_id"]);
    }
     
    public function getCountry()
    {
        //客戶和國家是一對一的關系所以用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中關閉debug后return $this->redirect($url);不能跳轉(zhuǎn),服務器報500錯誤。

問題分析:

1.必須 return 才能讓$this->redirect($url);立馬跳轉(zhuǎn), 而不執(zhí)行后續(xù)代碼;

2.redirect() 中指定了響應的 http status code,默認是302;

3.當執(zhí)行$this->redirect($url)時,不管是否在后面加return false 、return true都沒有用,還是繼續(xù)執(zhí)行完代碼。使用header("Location:$url");exit;可以解決此問題,但是,這不是yii2的邏輯,并不完美。

解決辦法:

1.在正常情況下,使用

return $this->redirect($url);

2.在解決方案1不生效時,用

$this->redirect($url);Yii::$app->response->send();

3.在解決方案2不生效時,用

$this->redirect($url);Yii::$app->end();

總結(jié):

用Yii::$app->end();、Yii::$app->response->send();
不管在actionXXX還是init方法都能終止代碼,而return只能在action終止代碼,是因為在init()里僅僅是代碼的執(zhí)行,return只是代碼返回。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31372.html

相關文章

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

    摘要:多入口模式,多入口分為后臺前端,微信,其他或接口對接,不同的業(yè)務不同的設備進入不同的入口。對接微信公眾號,使用了一款優(yōu)秀的微信非官方,系統(tǒng)內(nèi)已集成了該,調(diào)用方式會在文檔說明,也可直接看其文檔進入深入開發(fā)。 RageFrame 為二次開發(fā)而生,讓開發(fā)變得更簡單。 前言 RageFrame項目創(chuàng)建于2016年4月16日,基于Yii2框架開發(fā)的應用開發(fā)引擎,目前正在成長中,目的是為了集成更多...

    enda 評論0 收藏0
  • RageFrame 一個 Yii2 + AdminLET 免費開源多商戶通用后臺管理系統(tǒng)

    摘要:極致的插件機制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會對原來的系統(tǒng)產(chǎn)生影響強大的功能完全滿足各階段的需求,支持用戶多端訪問后臺微信前臺等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺前端,微信,對內(nèi)接口,對外接口,不同的業(yè)務,不同的設備,進入不同的入口。 RageFrame 2.0 為二次開發(fā)而生,讓開發(fā)變得更簡單 項目地址:https://github.com/jianyan74/... 前言 這...

    sunny5541 評論0 收藏0
  • RageFrame 一個 Yii2 + AdminLET 免費開源多商戶通用后臺管理系統(tǒng)

    摘要:極致的插件機制,系統(tǒng)內(nèi)的系統(tǒng),安裝和卸載不會對原來的系統(tǒng)產(chǎn)生影響強大的功能完全滿足各階段的需求,支持用戶多端訪問后臺微信前臺等,系統(tǒng)中的系統(tǒng)。多入口模式,多入口分為后臺前端,微信,對內(nèi)接口,對外接口,不同的業(yè)務,不同的設備,進入不同的入口。 RageFrame 2.0 為二次開發(fā)而生,讓開發(fā)變得更簡單 項目地址:https://github.com/jianyan74/... 前言 這...

    Ali_ 評論0 收藏0
  • PHP回顧之Composer

    摘要:本文簡要回顧相關概念和用法。相比之下已是明日黃花。分別對應的命令是根據(jù)關鍵字查找依賴包,例如查找本人發(fā)布的包。作為目前包依賴管理的最佳工具,值得每一位開發(fā)人員掌握。 轉(zhuǎn)載請注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 session 數(shù)據(jù)庫操作 加解密 Composer是PHP...

    Ocean 評論0 收藏0

發(fā)表評論

0條評論

W_BinaryTree

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<