首頁  >  文章  >  後端開發  >  [PHP]Yii2框架的坑

[PHP]Yii2框架的坑

WBOY
WBOY原創
2016-07-30 13:31:041013瀏覽

Yii2框架的幾個隊列的坑


摘要:Yii2是一款優秀的通用Web框架,結構簡單優雅、實用功能豐富、擴展性強、性能搞是他最突出的優點。它很好的地方你在使用過程中總能輕易的發現,避免贅述。而這些位置的小瑕疵,更多需要大家告訴。


  • 部落格: http://www.cnblogs.com/jhzhu
  • 郵箱: jhzhuustc@gmail.com
  • 作者: 知明所以
  • 時間: 2015-08-170框架的幾個隱蔽的坑
目錄

說點閒話

ActiveRecord被莫名寫入?

  • 準備知識
    • 程式碼現場
    • 總結問題
    • 解決方法
      • 你的Transaction生效了嗎?
      • 程式碼現場
      • 問題總結
      解決方法
      • 'Y-m-d'不被辨識?
      • 程式碼現場
      • 問題總結
      • 說點閒話
      距離上次寫博客,已經有三個月了。在動手寫之前,總是帶著深深的罪惡感。被它折磨許久,終於,還是,動手了。
    值得慶祝的一件事:最近開始,每天早上8:30起來健身了。有兩個影片很好用,只需8分鐘,照著做一遍保證你(生)爽(不)到(如)爆(死)。 (8分鐘腹肌運動第2級-下載,8分鐘胸肌鍛鍊第2級-下載)
值得反思的一件事:最近看了《叔本華美學隨筆》,改變了我一直以來對閱讀的看法。我曾經以為閱讀是進步的動力,卻被這本書深深的打臉了。來,先給大家分享一段:

我們只管所見的外在環境並不像閱讀物那樣,把某已確定的見解強加給我們的頭腦,而只是為我們提供了素材和機會。去思考與我們的頭腦能力相稱、與當下的情緒相符的事。所以,太多的閱讀會是我們的精神失去彈性,就像把一重物持續壓在一條彈簧上面就會是彈簧失去彈性一樣;而讓自己沒有自己思想的最穩妥的辦法就是在空閒的每一分鐘馬上隨手拿起一本書。

思考才是進步的來源動力!

好了,扯淡完畢,步入正題。

ActiveRecord被莫名寫入?

準備知識

ActiveRecord

的基本用法。如果不理解,可參考這裡。

程式碼現場

    <span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> * @property string $detail</span><span> * @property double $price</span><span> * @property integer $area</span><span> **/</span><span>class OcRoom extends ActivieRecord</span><span>{</span><span>    ...</span><span>}</span><span>$room = OcRoom::find()      //先取出一个对象。</span><span>    ->select(['id'])        //只取出'id'列</span><span>    ->where(['id'=>20])</span><span>    ->one();</span><span>$room->save();              //保存,会发现此行的其它字段都被写成默认值了。</span>
  1. 總結問題
  2. 這個例子的問題在於:

我從資料庫中取出了一行,也就是程式碼中的

$room

我從資料庫中取出了一行,也就是程式碼中的

$room

我從資料庫中取出了一行,也就是程式碼
    $room
  1. ,但是只取出了而其他欄位自然就是預設值。 當我$room->save()
  2. 的時候,那些是預設值的欄位也被儲存到資料庫裡去了。 what!?
  3. 也就是說,當你想節約資源,不取出所有欄位的時候,一定要注意不能儲存,否則,很多資料會被莫名修改為預設值。
  4. 解決方法
然而,我們有什麼解決方法呢?提供幾個思路:

自己時時刻刻注意,避免未完全取出的

ActiveRecord
    的保存。
  1. 修改或繼承ActiveRecord
  2. , 使得,當此物件由
  3. find()新建,且欄位沒有完全取出,呼叫save()方法,拋出異常。 修改或繼承ActiveRecord
  4. ,使得,當此物件由
  5. find()新建,且字段沒有完全取出,調用save()方法時,只保存取出過的字段,其他字段被忽略。 你的Transaction生效了嗎?
程式碼現場

<span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> **/</span><span>class OcRoom extends ActiveRecord</span><span>{</span><span>    public function rules()</span><span>    {</span><span>        return [['name','string','min'=>2,'max'=>10]];</span><span>    }</span><span>    ...</span><span>}</span><span>class OcHouse extends ActiveRecord</span><span>{</span><span>    public function rules()</span><span>    {</span><span>        return [['name','string','max'=>10]];</span><span>    }</span><span>    ...</span><span>}</span><span>$a = new OcRoom();</span><span>$a->name = '';                //name为空字符串,不满足rules()条件。</span><span>$b = new OcHouse();</span><span>$b->name = '我的房间';         //name合法,可以保存。</span><span>$transaction = Yii::$app->db->beginTransaction();</span><span>try{</span><span>    $a->save();               //name字段不合法,无法验证通过,在validate()阶段已经返回false,不会进行数据库存储的步骤,所以也不会抛出异常。</span><span>    $b->save();               //name字段合法,可以正常保存。</span><span>    $transaction->commit();   //提交后,发现$a保存失败,而$b保存成功。</span><span>}</span><span>catch (Exception $e) </span><span>{</span><span>    Yii::error($e->getTraceAsString(),__METHOD__);</span><span>    $transaction->rollBack();</span><span>}</span>

問題總結

這段程式碼的問題在於:

大家知道

$transaction
    的存在意義是保證整段資料庫儲存程式碼要麼全成功,要麼全成功。
  1. 顯然,在這個例子中,transaction
  2. 並沒有達到我們想要的效果:
  3. $a因為validate()都沒過,所以$transation->commit()的時候並不會報錯誤。 解決方法

$transation

塊內,所有的

save()都要判斷下回傳值,如果為false,則直接拋出異常。 'Y-m-d'不被辨識?

代碼現場

<span>OcRenterBill extends ActiveRecord</span><span>{</span><span>    public function rules()</span><span>    {</span><span>        return [</span><span>            ['start_time','date','format'=>'Y-m-d'],</span><span>        ];</span><span>    }</span><span>}</span><span>$a = new OcRenterBill();</span><span>$a = '2015-09-12';</span><span>$a->save();                 //会报错,说格式不对。</span>

問題總結

如果一開始,Yii框架就報錯,這個還不算坑。坑的是我在Mac上開發時,這個可以完全正常的工作,而發佈到線上環境(Ubuntu)後,就彈出“屬性start_time格式無效”的錯誤。而參考官方文檔,發現這種格式是允許的官方文檔。

啊啊啊。各種試錯,最後發現如果改成

php:Y-m-d

,世界就清淨了。所以,如果你遇到這種問題,感激我吧。

以上就介紹了[PHP]Yii2框架的坑,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:ELB端啟蒙下一篇:ELB端啟蒙