分类 Yii 2 框架 下的文章

yii\base\Controller里,有一个public method,是beforeAction,这个方法,yii\base\ActionFilter也有的,并且这个ActionFilter其实是yii\base\Behavior的一个子类。

注意一下继承关系:
yii\base\BaseObject

  • yii\base\Component
    • yii\base\Controller
  • yii\base\Behavior
    • yii\base\ActionFilter

这两个不同的类,但又同样一个beforeAction方法。

顾名思义,这个方法就是在action之前最后一步,原文是:

yii\base\Controller : This method is invoked right before an action is executed.
yii\base\ActionFilter : This method is invoked right before an action is to be executed (after all possible filters.) You may override this method to do last-minute preparation for the action.

都是接受一个参数,Action $action,返回值都是true 或者 false

或者return parent::beforeAction($action)

返回的结果,决定了该$action是否被执行。

通常,在Yii2 Controller里做重定向(redirect),一般用下面的方式:

public function actionHello()
{
   return $this->redirect('/world');
}

public function actionWorld()
{
   return 'World!';
}

这种方式的后果是,http status code是302

那么,如果想修改为301怎么办呢?

 return $this->redirect('/world', 301)->send();

Behaviors

Behaviors are instances of yii\base\Behavior, or of a child class. Behaviors, also known as mixins, allow you to enhance the functionality of an existing component class without needing to change the class's inheritance. Attaching a behavior to a component "injects" the behavior's methods and properties into the component, making those methods and properties accessible as if they were defined in the component class itself.
Moreover, a behavior can respond to the events triggered by the component, which allows behaviors to also customize the normal code execution of the component.

这两段话,是Yii2官网上对Bahaviors的定义。先尝试着理解第一段话。

- 阅读剩余部分 -

yii2-app-basic会经常出现一个bug,就是找不到vendor/bower这个目录,这是由于某种神秘原因,执行composer install的时候,会安装到vendor/bower-asset这个目录下。

具体原因不明。

需要做如下修改:

修改的文件路径是:vendor/yiisoft/yii2/base/Application.php,第461行, 改为bower-asset

- 阅读剩余部分 -

最近遇到一个问题,在一个transaction里,会遇到保存不成功,但transaction不回滚的问题。

我还以为是Yii的问题,后来才发现是自己对try catch的理解不到位。

transaction是要进行try catch的,如果try block里数据库保存失败,例如$user->save()或者$order->save()不成功,返回值false,但也仅此而已了,不抛出异常,因此transactiontry block中捕获不到Exception,自然就不回滚。

- 阅读剩余部分 -

Model类或者ActiveRecord类,里面会有一个rules,规定了所有的attribute的限制条件。
然后呢,万一生成的时候,把id也写到rules里,而且是['id', required]
好了,就傻逼了,保存不了,而且不报错。

而且,更要命的是,transaction还不回滚!!!

可以说,用gii生成的代码问题多多,都遇到两回因为gii的原因导致的问题了。

2018年6月8日更新:
这是由于如果$user->save()失败,会返回false,但不抛出异常,应该用if判断一下,如果返回false,则手动抛出异常。