分类 Yii 2 框架 下的文章

$model->save()的时候,如果不符合rules,会导致保存失败,但不抛出异常,所以这个时候,就需要看一下是不是rules设置的问题,所以可以这样做:

$model->save(false)

这样做,就是绕过了rules里对数据的validation,首先保证了,你对数据库的CRUD是成功的,代码是OK的,然后再看,是否是数据的问题。

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,自然就不回滚。

- 阅读剩余部分 -