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

Yii2在任何用户创建或更新后向管理员发送消息(或通知),yii2,Yii2,三周前,我试图找到一种在任何用户创建或更新后向管理员发送消息(或通知)的方法,但结果一无所获。我搜索了很多,但没有找到一个明确的解决方案,我试图了解Yii2事件,我找到了这个链接 我认为这是解决我问题的关键,但我真的被卡住了,我不知道该怎么办,希望有人能帮助我 谢谢你有“用户”的地址吗?如果是,则只需重写方法afterSave(它在模型中进行任何更改后完全激发),如下所示: public function beforeSave($insert) { if (parent::before

三周前,我试图找到一种在任何用户创建或更新后向管理员发送消息(或通知)的方法,但结果一无所获。我搜索了很多,但没有找到一个明确的解决方案,我试图了解Yii2事件,我找到了这个链接

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

谢谢

你有“用户”的地址吗?如果是,则只需重写方法afterSave(它在模型中进行任何更改后完全激发),如下所示:

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

        // your notification logic here

        return true;
    }

    return false;
}
你有“用户”的地址吗?如果是,则只需重写方法afterSave(它在模型中进行任何更改后完全激发),如下所示:

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

        // your notification logic here

        return true;
    }

    return false;
}
考虑使用一个新的方法来处理这个问题

假设

  • 您的项目中至少有一个(可能有多个)
  • 您有一个包含至少两个操作的操作:actionCreate和actionUpdate
  • 每当调用上述任一操作时,都会向管理员发送电子邮件
事件和行为

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

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

建议的解决方案

现在我们对事件和行为有了一点了解,我们可以创建一个行为,每当触发insert或update事件时执行一些自定义代码。此自定义代码可以检查所调用操作的名称(是否称为create或update?),以确定是否需要发送电子邮件

不过,这种行为本身是无用的,我们需要将它附加到任何应该触发它的模型上

解决方案的实施

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'
    }
  }

}
考虑使用

假设

  • 您的项目中至少有一个(可能有多个)
  • 您有一个包含至少两个操作的操作:actionCreate和actionUpdate
  • 每当调用上述任一操作时,都会向管理员发送电子邮件
事件和行为

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

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

建议的解决方案

现在我们对事件和行为有了一点了解,我们可以创建一个行为,每当触发insert或update事件时执行一些自定义代码。此自定义代码可以检查所调用操作的名称(是否称为create或update?),以确定是否需要发送电子邮件

不过,这种行为本身是无用的,我们需要将它附加到任何应该触发它的模型上

解决方案的实施

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'
    }
  }

}

您可以使用Yii::trace方法发送通知,将其放入方法中进行跟踪。检查文档,按照您必须做的那样用示例进行解释。感谢您的回复,实际上我不是Yii2专家,我不擅长使用文档,我使用“Yii2基本模板”,如果您可以一步一步地告诉我需要做什么,当用户插入新记录或更新时,我希望使用(用户名和sql语句)发送消息或通知感谢管理员。再次感谢您的时间如果您不熟悉日志记录,您也可以在用户注册后使用表示日志记录的自定义查询。感谢@EdvinTenovimas如果您可以给我一个示例代码感谢@Edvintenovimasy您可以使用Yii::trace方法发送通知,放入方法中进行跟踪。检查文档这说明了你必须做的事情。谢谢你的回复,实际上我不是Yii2专家,我不擅长使用文档,我使用“Yii2基本模板”,如果你能一步一步告诉我我需要做什么,当用户插入新记录或更新时,我想发送一条消息或通知(用户名和sql语句)感谢管理员。再次感谢您的时间如果您不熟悉日志记录,您也可以在用户注册后使用表示日志记录的自定义查询。感谢@EdvinTenovimas如果您能给我一个示例代码感谢@Edvintenovimases我有一个用户模块,感谢您的评论是的,我有一个用户模块,感谢您的推荐非常感谢,实际上我有3个由Gii生成的模型,我会试试你的方法,但是我应该把NotificationBehavior.php文件放在哪里,我可能会创建一个名为components的新文件夹:app/components。如果你对文件的保存位置感到困惑,请查看文件顶部的名称空间,在大多数情况下,这将提供对其中的文件夹进行反编译