【问题标题】:How to passing parameter to afterSave() Method in yii2?如何将参数传递给yii2中的afterSave()方法?
【发布时间】:2016-09-01 06:54:52
【问题描述】:

我是 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);
    }
}

DamageController

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,
            ]);
}

【问题讨论】:

    标签: yii2 after-save


    【解决方案1】:
    public function init(){
            $this->on(self::EVENT_AFTER_INSERT, [$this, 'sendMail']);               
        }
    
    public function sendMail($event) {
    
    }
    

    【讨论】:

    • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
    【解决方案2】:

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

    //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_id ,但这会产生另外 1 个数据库请求。

    【讨论】:

      【解决方案3】:

      您可以在损害模型中创建属性$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;
      
          // ...
      
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-18
        • 1970-01-01
        • 2021-12-13
        • 2012-02-23
        • 2011-07-25
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多