Skip to main content

常用的before和after汇集

beforeAction       afterAction    方法 前后被调用的方法
beforeFilter       afterFilter    过滤 前后被调用的方法
beforeRender       afterRender       输出 前后被调用的方法
beforeValidate    afterValidate    校验 前后被调用的方法
beforeSave       afterSave       这两个将在保存 AR 实例之前和之后被调用
beforeDelete    afterDelete    这两个将在一个 AR 实例被删除之前和之后被调用
beforeLoad    afterLoad    Integrity 开关  before为false  after为true
beforeUnload    afterUnload    Integrity 开关  before为false  after为true
beforeSend    afterSend    邮件发送前后被调用的方法
beforeLogin    afterLogin    用户成功登录前后被调用的方法
beforeLogout    afterLogout    用户成功登出前后被调用的方法

————————————————
版权声明:本文为CSDN博主「zhengtao27」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhengtao27/article/details/49763241

Model 层
保存之前的事件示例

public function beforeSave($insert)
{
  if (parent::beforeSave($insert)) {
    // 插入新数据判断订单号是否存在
    if (!Order::findModel(['trade_no' => $this->order_trade_no])) {
      throw new Exception("订单号不存在");
    }
    return true;
  } else {
    return false;
  }
}


保存之后的事件示例

public function afterSave($insert, $changedAttributes)
{
  parent::afterSave($insert, $changedAttributes);
  if ($insert) {
    // 插入新数据之后修改订单状态
    Order::updateAll(['shipping_status' => Order::SHIPPING_STATUS1, 'shipping_at' => time()], ['trade_no' => $this->order_trade_no]);
  }
}


删除之前的事件示例

public function beforeDelete()
{
    if (parent::beforeDelete()) {
        // something code
        return true;
    } else {
        return false;
    }
}


删除之后的事件示例

public function afterDelete()
{
    parent::afterDelete();
}


Model 事件怎么保证数据事务呢?
添加一下代码在 Model 中:

public function transactions()
{
    return [
        self::SCENARIO_DEFAULT => self::OP_INSERT | self::OP_UPDATE | self::OP_DELETE
        // self::SCENARIO_DEFAULT => self::OP_INSERT
    ];
}


Controller 层
每次请求之前操作示例

/**
 * @param \yii\base\Action $action
 * @return bool
 * @throws \yii\web\BadRequestHttpException
 */
public function beforeAction($action)
{
    if (parent::beforeAction($action)) {
        $this->request = Yii::$app->request;
        Yii::info($this->request->absoluteUrl, '请求地址');
        Yii::info($this->request->rawBody, '请求数据');
        return true;
    } else {
        return false;
    }
}


每次请求之后操作示例

/**
 * @param \yii\base\Action $action
 * @param mixed $result
 * @return array|mixed
 * @throws BusinessException
 */
public function afterAction($action, $result)
{
    Yii::info(\yii\helpers\Json::encode($result), '请求返回结果');
    return $result;
}

来自 <https://www.sunyann.com/yii2-before-after/>