摘要:Yii2是一款优秀的通用Web后端框架,结构简单优雅、实用功能丰富、扩展性强、性能搞是他最突出的优点。它优秀的地方你在使用过程中总能轻易的发现,无须赘述。而这些隐蔽的小瑕疵,显得更有必要告诉大家。
距离上次写博客,已经有三个月了。在动手写之前,总是带着深深的罪恶感。被它折磨许久,终于,还是,动手了。
值得庆祝的一件事:最近开始,每天早上8:30起来健身了。有两个视频很好用,只需8分钟,照着做一遍保证你(生)爽(不)到(如)爆(死)。(8分钟腹肌锻炼第2级-下载,8分钟胸肌锻炼第2级-下载)
值得反思的一件事:最近看了《叔本华美学随笔》,改变了我一直以来对阅读的看法。我曾经以为阅读是进步的源动力,却被这本书深深的打脸了。来,先给大家分享一段:
<p>我们只管所见的外在环境并不像阅读物那样,把某已确定的见解强加给我们的头脑,而只是为我们提供了素材和机会。去思考与我们的头脑能力相称、与当下的情绪相符的事情。所以,太多的阅读会是我们的精神失去弹性,就像把一重物持续压在一条弹簧上面就会是弹簧失去弹性一样;而让自己没有自己思想的最稳妥的办法就是在空闲的每一分钟马上随手拿起一本书。</p>
思考才是进步的源动力!
好了,扯淡完毕,步入正题。
<span class="x">/**</span> <span class="x"> * @property integer $id</span> <span class="x"> * @property string $name</span> <span class="x"> * @property string $detail</span> <span class="x"> * @property double $price</span> <span class="x"> * @property integer $area</span> <span class="x"> **/</span> <span class="x">class OcRoom extends ActivieRecord</span> <span class="x">{</span> <span class="x"> ...</span> <span class="x">}</span> <span class="x">$room = OcRoom::find() //先取出一个对象。</span> <span class="x"> ->select(['id']) //只取出'id'列</span> <span class="x"> ->where(['id'=>20])</span> <span class="x"> ->one();</span> <span class="x">$room->save(); //保存,会发现此行的其它字段都被写成默认值了。</span>
这个例子的问题在于:
然而,我们有什么解决办法呢?提供几种思路:
<span class="x">/**</span> <span class="x"> * @property integer $id</span> <span class="x"> * @property string $name</span> <span class="x"> **/</span> <span class="x">class OcRoom extends ActiveRecord</span> <span class="x">{</span> <span class="x"> public function rules()</span> <span class="x"> {</span> <span class="x"> return [['name','string','min'=>2,'max'=>10]];</span> <span class="x"> }</span> <span class="x"> ...</span> <span class="x">}</span> <span class="x">class OcHouse extends ActiveRecord</span> <span class="x">{</span> <span class="x"> public function rules()</span> <span class="x"> {</span> <span class="x"> return [['name','string','max'=>10]];</span> <span class="x"> }</span> <span class="x"> ...</span> <span class="x">}</span> <span class="x">$a = new OcRoom();</span> <span class="x">$a->name = ''; //name为空字符串,不满足rules()条件。</span> <span class="x">$b = new OcHouse();</span> <span class="x">$b->name = '我的房间'; //name合法,可以保存。</span> <span class="x">$transaction = Yii::$app->db->beginTransaction();</span> <span class="x">try{</span> <span class="x"> $a->save(); //name字段不合法,无法验证通过,在validate()阶段已经返回false,不会进行数据库存储的步骤,所以也不会抛出异常。</span> <span class="x"> $b->save(); //name字段合法,可以正常保存。</span> <span class="x"> $transaction->commit(); //提交后,发现$a保存失败,而$b保存成功。</span> <span class="x">}</span> <span class="x">catch (Exception $e) </span> <span class="x">{</span> <span class="x"> Yii::error($e->getTraceAsString(),__METHOD__);</span> <span class="x"> $transaction->rollBack();</span> <span class="x">}</span>
这段代码的问题在于:
在$transation
块内,所有的save()
都要判断下返回值,如果为false
,则直接抛出异常。
<span class="x">OcRenterBill extends ActiveRecord</span> <span class="x">{</span> <span class="x"> public function rules()</span> <span class="x"> {</span> <span class="x"> return [</span> <span class="x"> ['start_time','date','format'=>'Y-m-d'],</span> <span class="x"> ];</span> <span class="x"> }</span> <span class="x">}</span> <span class="x">$a = new OcRenterBill();</span> <span class="x">$a = '2015-09-12';</span> <span class="x">$a->save(); //会报错,说格式不对。</span>
如果一开始,Yii框架就报错,这个还不算坑。坑的是我在Mac上开发时,这个可以完全正常的工作,而发布到线上环境(Ubuntu)后,就弹出“属性start_time格式无效”的错误。而参考官方文档,发现这种格式是允许的官方文档。
啊啊啊。各种试错,最后发现如果改成php:Y-m-d
,世界就清净了。所以,如果你遇到这种问题,感激我吧。