需要更多关于事件的澄清YII2

时间:2017-01-07 07:43:25

标签: php yii2

尝试在Yii中学习事件2.我找到了一些资源。我得到更多关注的链接就在这里。

How to use events in yii2?

在第一条评论中,他用一个例子来解释。比如一个实例,我们在注册后有10件事要做 - 事情在这种情况下很方便。

调用该功能是一件大事吗?模型init方法中也发生了同样的事情:

$this->on(self::EVENT_NEW_USER, [$this, 'sendMail']);
$this->on(self::EVENT_NEW_USER, [$this, 'notification']);

我的问题是使用事件有什么意义?我应该如何充分利用它们。请注意这个问题纯粹是学习Yii 2的一部分。请举例说明。提前谢谢。

1 个答案:

答案 0 :(得分:4)

我使用触发事件来写入(默认情况下)事件,例如在验证之前或删除之前。这是一个很好的例子。

想象一下,你有一些用户。一些用户(例如管理员)可以编辑其他用户。但是你想确保遵循特定的规则(让我们来看看:Only main administrator can create new users and main administrator cannot be deleted)。然后你可以做的是使用这些书面默认事件。

User模型中(假设User模型包含所有用户),您可以编写init()以及您在init()中定义的所有其他方法:

public function init()
{
    $this->on(self::EVENT_BEFORE_DELETE, [$this, 'deletionProcess']);
    $this->on(self::EVENT_BEFORE_INSERT, [$this, 'insertionProcess']);
    parent::init();
}

public function deletionProcess()
{
    // Operations that are handled before deleting user, for example:
    if ($this->id == 1) {
        throw new HttpException('You cannot delete main administrator!');
    }
}

public function insertionProcess()
{
    // Operations that are handled before inserting new row, for example:
    if (Yii::$app->user->identity->id != 1) {
        throw new HttpException('Only the main administrator can create new users!');
    }
}

self::EVENT_BEFORE_DELETE之类的常量已经定义,顾名思义,这个常量在删除行之前就被触发了。

现在在任何控制器中我们都可以编写一个触发这两个事件的示例:

public function actionIndex()
{
    $model = new User();
    $model->scenario = User::SCENARIO_INSERT;
    $model->name = "Paul";
    $model->save(); // `EVENT_BEFORE_INSERT` will be triggered

    $model2 = User::findOne(2);
    $model2->delete(); // `EVENT_BEFORE_DELETE` will be trigerred
    // Something else
}