Heim  >  Artikel  >  Backend-Entwicklung  >  [PHP] Fallstricke des Yii2-Frameworks

[PHP] Fallstricke des Yii2-Frameworks

WBOY
WBOYOriginal
2016-07-30 13:31:041056Durchsuche

Yii2框架的几个隐蔽的坑


摘要:Yii2是一款优秀的通用Web后端框架, 结构简单优雅、实用功能丰富、扩展性强、性能搞是他最突出的优点.它优秀的地方你在使用过程中总能轻易的发现,无须赘述.而这些隐蔽的小瑕疵,显得更有必要告诉大家.


  • Blog: http://www.cnblogs.com/jhzhu
  • E-Mail: jhzhuustc@gmail.com
  • Autor: Zhimingso
  • Zeit: 17.08.2015

Inhaltsverzeichnis

  • Mehrere versteckte Fallstricke des Yii2-Frameworks
    • Inhaltsverzeichnis Inhalt
    • Apropos Klatsch
    • ActiveRecord wurde aus unerklärlichen Gründen geschrieben?
      • Wissen vorbereiten
      • Codeszene
      • Zusammenfassung des Problems
      • Lösung
    • Wurde Ihre Transaktion wirksam? ?
      • Codeszene
      • Problemzusammenfassung
      • Lösung
    • 'Y-m-d' wird nicht erkannt?
      • Codeszene
      • Problemzusammenfassung

Über Klatsch sprechen

Entfernung Es ist drei Monate her, seit ich das letzte Mal gebloggt habe. Bevor ich anfange zu schreiben, verspüre ich immer ein tiefes Schuldgefühl. Nachdem ich lange davon gequält worden war, habe ich endlich gehandelt.

Eine Sache, die es wert ist, gefeiert zu werden: Seit Kurzem stehe ich jeden Morgen um 8:30 Uhr auf, um Sport zu treiben. Es gibt zwei Videos, die sehr nützlich sind und nur 8 Minuten dauern. Folgen Sie ihnen einfach und ich garantiere Ihnen, dass Sie glücklich sein werden, aber nicht zu Tode explodieren. (8-minütiges Bauchmuskeltraining Level 2 – Download, 8-minütiges Brustmuskeltraining Level 2 – Download)

Eine Sache, über die es sich zu bedenken lohnt: Ich habe kürzlich „Schopenhauers Essays über Ästhetik“ gelesen und es hat mein Leben verändert. Ansichten zum Lesen. Früher dachte ich, dass Lesen die Quelle des Fortschritts sei, aber dieses Buch hat mich tief ins Gesicht geschlagen. Komm schon, lass mich einen Absatz mit dir teilen:

Solange die äußere Umgebung, die wir sehen, unserem Geist keine bestimmte Meinung aufzwingt, wie Lesematerialien, bietet sie uns nur Materialien und Möglichkeiten. Dinge zu denken, die unseren geistigen Fähigkeiten und unseren aktuellen Emotionen entsprechen. Wenn wir also zu viel lesen, verliert unser Geist seine Elastizität, so wie wenn ein schwerer Gegenstand weiterhin auf eine Feder gedrückt wird, verliert die Feder ihre Elastizität und der sicherste Weg, sich selbst davon abzuhalten, eigene Gedanken zu haben, ist, alles zu lesen Schnappen Sie sich gleich ein Buch.

Denken ist die Quelle des Fortschritts!

Okay, genug Unsinn, kommen wir zum Punkt.

ActiveRecord wurde aus unerklärlichen Gründen geschrieben?

Bereiten Sie die grundlegende Nutzung des Wissens vor

  1. ActiveRecord. Wenn Sie es nicht verstehen, können Sie hier nachschlagen.

Codeszene

<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>

Zusammenfassung des Problems

Das Problem in diesem Beispiel ist:

  1. I Eine Zeile wird aus der Datenbank entnommen, die das $room im Code ist, aber nur das Feld id wird entnommen, und andere Felder sind natürlich Standardwerte.
  2. Als ich $room->save() habe, wurden diese Felder mit Standardwerten auch in der Datenbank gespeichert. was!?
  3. Mit anderen Worten, wenn Sie Ressourcen sparen und nicht alle Felder entfernen möchten, müssen Sie darauf achten, sie nicht zu speichern, da sonst viele Daten aus unerklärlichen Gründen auf Standardwerte geändert werden.

Lösung

Aber welche Lösung haben wir? Geben Sie mehrere Ideen:

  1. Achten Sie immer auf sich selbst, um zu vermeiden, dass etwas gespeichert wird, ActiveRecorddas nicht vollständig herausgenommen wird.
  2. ändert oder erbt ActiveRecord, sodass, wenn dieses Objekt von find() erstellt wird und die Felder nicht vollständig entfernt werden, die Methode save() aufgerufen und eine Ausnahme ausgelöst wird.
  3. ändert oder erbt ActiveRecord, sodass, wenn dieses Objekt von find() erstellt wird und die Felder nicht vollständig extrahiert werden, beim Aufruf der save()-Methode nur die extrahierten Felder gespeichert werden und andere Felder gespeichert werden ignoriert.

Ist Ihre Transaktion wirksam geworden?

Codeszene

<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>

Problemzusammenfassung

Das Problem mit diesem Code ist:

  1. Jeder weiß es besteht darin, sicherzustellen, dass der gesamte Datenbankspeichercode entweder erfolgreich ist oder fehlschlägt. $transaction
  2. Offensichtlich erzielt
  3. in diesem Beispiel nicht den gewünschten Effekt: transactionDa $a nicht bestanden wurde, wird kein Fehler gemeldet, wenn validate() bestanden wird. $transation->commit()
Lösung

Im

-Block müssen alle $transations den Rückgabewert ermitteln. Wenn dieser save() ist, wird direkt eine Ausnahme ausgelöst. false

'Y-m-d' wird nicht erkannt?

Codeszene

<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>
Problemzusammenfassung

Wenn das Yii-Framework zu Beginn einen Fehler meldet, wird dies nicht als Fallstrick angesehen. Das Problem ist, dass das beim Entwickeln auf dem Mac völlig normal funktioniert, aber nach der Veröffentlichung in der Online-Umgebung (Ubuntu) die Fehlermeldung „Das Format des Attributs start_time ist ungültig“ erscheint. Unter Bezugnahme auf die offiziellen Dokumente habe ich festgestellt, dass dieses Format in offiziellen Dokumenten zulässig ist.

Ahhhh. Nach mehreren Versuchen und Irrtümern habe ich schließlich herausgefunden, dass die Welt sauberer wäre, wenn ich es in

ändern würde. Wenn Sie also auf dieses Problem stoßen, danken Sie mir. php:Y-m-d

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:ELB-seitige AufklärungNächster Artikel:ELB-seitige Aufklärung