Yii2在任何用户创建或更新后向管理员发送消息(或通知)

时间:2016-12-03 17:40:03

标签: yii2

三周前,我试图找到一种方法在任何用户创建或更新后向管理员发送消息(或通知),但最终没有任何结果。我搜索了很多,我没有找到一个明确的解决方案,我试图了解Yii2事件,我找到了这个链接 http://www.yiiframework.com/wiki/329/real-time-display-of-server-push-data-using-server-sent-events-sse/

我认为这是解决我问题的关键,但我真的被困住了,我不知道该怎么办,希望有人能帮助我。

谢谢

2 个答案:

答案 0 :(得分:3)

考虑使用behavior来处理此问题。

<强>假设

  • 项目中至少有一个model(可能是多个)。
  • 您的controller至少包含两项操作:actionCreate和actionUpdate。
  • 只要调用上述任一操作,就会向管理员发送电子邮件。

事件和行为

当调用actionCreate时,新记录通过扩展ActiveRecord的模型类的实例插入到数据库中。同样,当调用actionUpdate时,将从数据库中提取现有记录,更新并保存回来。在这两种情况下,模型都会触发event(即:插入或更新)(因为模型扩展了组件,组件负责实现事件)。 Yii2提供了使用行为响应这些事件的能力,这些行为定制了组件的正常代码执行“。

简而言之,这意味着您可以将自定义代码绑定到任何给定的事件,以便在触发事件时执行代码

提议的解决方案

现在我们对事件和行为有了一些了解,我们可以创建一个行为,只要触发插入或更新事件,就会执行一些自定义代码。此自定义代码可以检查被调用操作的名称(称为创建还是更新?),以确定是否需要发送电子邮件。

这种行为本身就没用了,我们需要将它附加到应该触发它的任何模型上。

解决方案的实施

NotificationBehavior.php

<?php

namespace app\components;

use yii\base\Behavior;
use yii\db\ActiveRecord;

class NotificationBehavior extends Behavior
{

  /**
   * Binds functions 'afterInsert' and 'afterUpdate' to their respective events.
   */
  public function events()
  {
    return [
      ActiveRecord::EVENT_AFTER_INSERT => 'afterInsert',
      ActiveRecord::EVENT_AFTER_UPDATE => 'afterUpdate',
    ];
  }

  /**
   * This function will be executed when an EVENT_AFTER_INSERT is fired
   */
  public function afterInsert($event)
  {
    // check the 'id' (name) of the action
    if (Yii::$app->controller->action->id === 'create') {
      // send email to administrator 'user performed insert'
    }
  }

  /**
   * This function will be executed when an EVENT_AFTER_UPDATE is fired
   */
  public function afterUpdate($event)
  {
    if (Yii::$app->controller->action->id === 'update') {
      // send email to administrator 'user performed update'
    }
  }

}

PostController.php

<?php

namespace app\controllers;

use Yii;
use app\models\Post;
use yii\web\Controller;
use yii\web\NotFoundHttpException;

class PostController extends Controller
{
    /**
     * Creates a new record
     */
    public function actionCreate()
    {
        $model = new Post;

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Updates an existing record
     */
    public function actionUpdate()
    {
        // ...
    }

}

Post.php(模特)

<?php

namespace app\models;

use app\components\NotificationBehavior;
use yii\db\ActiveRecord;

class Post extends ActiveRecord
{
  /**
   * specify any behaviours that should be tied to this model.
   */
  public function behaviors()
  {
      return [
          // anonymous behavior, behavior class name only
          NotificationBehavior::className(),
      ];
  }
}

我还建议查看Yii2's TimestampBehavior implementation以获得更具体的例子。

答案 1 :(得分:1)

你有model到“用户”吗?如果是,那么只需覆盖方法afterSave(它在模型中进行任何更改后完全触发),如下所示:

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {

        // your notification logic here

        return true;
    }

    return false;
}