Heim > Artikel > Backend-Entwicklung > [PHP] Fallstricke des Yii2-Frameworks
Yii2框架的几个隐蔽的坑
摘要:Yii2是一款优秀的通用Web后端框架, 结构简单优雅、实用功能丰富、扩展性强、性能搞是他最突出的优点.它优秀的地方你在使用过程中总能轻易的发现,无须赘述.而这些隐蔽的小瑕疵,显得更有必要告诉大家.
Inhaltsverzeichnis
Ü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
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:
$room
im Code ist, aber nur das Feld id
wird entnommen, und andere Felder sind natürlich Standardwerte. $room->save()
habe, wurden diese Felder mit Standardwerten auch in der Datenbank gespeichert. was!?Lösung
Aber welche Lösung haben wir? Geben Sie mehrere Ideen:
ActiveRecord
das nicht vollständig herausgenommen wird. 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. 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:
$transaction
transaction
Da $a
nicht bestanden wurde, wird kein Fehler gemeldet, wenn validate()
bestanden wird. $transation->commit()
-Block müssen alle $transation
s den Rückgabewert ermitteln. Wenn dieser save()
ist, wird direkt eine Ausnahme ausgelöst. false
<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>ProblemzusammenfassungWenn 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