如何在yii2中将参数传递给afterSave()方法?

如何在yii2中将参数传递给afterSave()方法?,yii2,after-save,Yii2,After Save,我是新来的yii2。我想在插入新记录后编写afterSave()方法。我的场景是:当用户添加一个损坏时,必须向他发送电子邮件。 当用户添加损坏时,不输入序列号。我应该读他的名字和序列号,但我不知道如何将序列号从控制器传递到模型 损坏模式: public function getUser() { return $this->hasOne(User::className(), ['id' => 'user_id']); } public function afterSave(

我是新来的yii2。我想在插入新记录后编写
afterSave()
方法。我的场景是:当用户添加一个损坏时,必须向他发送电子邮件。 当用户添加损坏时,不输入序列号。我应该读他的名字和序列号,但我不知道如何将序列号从控制器传递到模型

损坏模式

public function getUser()
{
    return $this->hasOne(User::className(), ['id' => 'user_id']);
}

 public function afterSave($insert, $changedAttributes)
{
    parent::afterSave($insert, $changedAttributes);
    $name = $this->user->name;
    $serial = ?
    $to = $this->user->email;
    $subject = 'new damage';
    $body = 'mr'.$name.'your damage with serial number'.$serial.'is registered';
    if ($insert) {

        App::sendMail($to, $subject, $body);
    }
}
public function actionAddDamage($serial){

  $model = new Damage();
  $gaurantee = Gaurantee::find()->where(['serial' =>  $serial])->andWhere(['user_id' => Yii::$app->user->id])->one();
  if (!$gaurantee)
        throw  new ForbiddenHttpException('You don't access');
  $model->gr_id = $gaurantee->id;
  if ($model->load(Yii::$app->request->post()) && $model->save()) {

            return $this->redirect(['view', 'id' => $model->id]);
        }
  return $this->render('addDamage',
            ['model' => $model,
                'servers' => $servers,
                'gaurantee' => $gaurantee,
            ]);
}
损坏控制器

public function getUser()
{
    return $this->hasOne(User::className(), ['id' => 'user_id']);
}

 public function afterSave($insert, $changedAttributes)
{
    parent::afterSave($insert, $changedAttributes);
    $name = $this->user->name;
    $serial = ?
    $to = $this->user->email;
    $subject = 'new damage';
    $body = 'mr'.$name.'your damage with serial number'.$serial.'is registered';
    if ($insert) {

        App::sendMail($to, $subject, $body);
    }
}
public function actionAddDamage($serial){

  $model = new Damage();
  $gaurantee = Gaurantee::find()->where(['serial' =>  $serial])->andWhere(['user_id' => Yii::$app->user->id])->one();
  if (!$gaurantee)
        throw  new ForbiddenHttpException('You don't access');
  $model->gr_id = $gaurantee->id;
  if ($model->load(Yii::$app->request->post()) && $model->save()) {

            return $this->redirect(['view', 'id' => $model->id]);
        }
  return $this->render('addDamage',
            ['model' => $model,
                'servers' => $servers,
                'gaurantee' => $gaurantee,
            ]);
}

您可以在损坏模型中创建属性
$serial
,并将序列值分配给控制器中的
$Model->serial
属性。例如:

class Damage extends yii\db\ActiveRecord
{
    public $serial = null;

    public function afterSave($insert, $changeAttributes) {
         // ...
         var_dump($this->serial);
    }
}
在控制器中,您可以为模型分配$serial:

public function actionAddDamage($serial) {

    $model = new Damage();
    $model->serial = $serial;

    // ...

}

您可以在损坏模型中创建属性
$serial
,并将序列值分配给控制器中的
$Model->serial
属性。例如:

class Damage extends yii\db\ActiveRecord
{
    public $serial = null;

    public function afterSave($insert, $changeAttributes) {
         // ...
         var_dump($this->serial);
    }
}
在控制器中,您可以为模型分配$serial:

public function actionAddDamage($serial) {

    $model = new Damage();
    $model->serial = $serial;

    // ...

}

首先想到的是在损伤模型中添加属性

//Damage model
public $serial;
然后,您可以在控制器中为此设置值:

public function actionAddDamage($serial){
      $model = new Damage();
      $gaurantee = Gaurantee::find()->where(['serial' =>       $serial])->andWhere(['user_id' => Yii::$app->user->id])->one();
      if (!$gaurantee)
          throw  new ForbiddenHttpException("you don't access");
      $model->serial = $serial;
      .....
afterSave()
方法中,您的序列号为
$this->serial


第二种方法是从担保表中获取它,因为您有
$this->gr\u id
,但这将再生成一个db请求。

首先想到的是在损坏模型中添加属性

//Damage model
public $serial;
public function init(){
        $this->on(self::EVENT_AFTER_INSERT, [$this, 'sendMail']);               
    }

public function sendMail($event) {

}
然后,您可以在控制器中为此设置值:

public function actionAddDamage($serial){
      $model = new Damage();
      $gaurantee = Gaurantee::find()->where(['serial' =>       $serial])->andWhere(['user_id' => Yii::$app->user->id])->one();
      if (!$gaurantee)
          throw  new ForbiddenHttpException("you don't access");
      $model->serial = $serial;
      .....
afterSave()
方法中,您的序列号为
$this->serial


第二种方法是从担保表中获取它,因为您有
$this->gr_id
,但这将生成一个额外的db请求。

虽然此代码可以回答问题,但提供有关如何以及为什么解决问题的附加上下文将提高答案的长期价值。虽然此代码可以回答问题,提供关于如何解决问题以及为什么解决问题的附加上下文将提高答案的长期价值。
public function init(){
        $this->on(self::EVENT_AFTER_INSERT, [$this, 'sendMail']);               
    }

public function sendMail($event) {

}