Как передать параметр методу afterSave() в yii2?

Я новичок в 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,
            ]);
}

person ParisaN    schedule 01.09.2016    source источник


Ответы (3)


Первое, что приходит на ум, это добавить атрибут в модель повреждений.

//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 запрос к базе данных.

person ineersa    schedule 01.09.2016

Вы можете создать свойство $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;

    // ...

}
person nadar    schedule 01.09.2016

person    schedule
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и почему он решает проблему, улучшит долгосрочную ценность ответа. - person Alexander; 07.03.2018