尝试在Yii中学习事件2.我找到了一些资源。我得到更多关注的链接就在这里。
在第一条评论中,他用一个例子来解释。比如一个实例,我们在注册后有10件事要做 - 事情在这种情况下很方便。
调用该功能是一件大事吗?模型init方法中也发生了同样的事情:
$this->on(self::EVENT_NEW_USER, [$this, 'sendMail']);
$this->on(self::EVENT_NEW_USER, [$this, 'notification']);
我的问题是使用事件有什么意义?我应该如何充分利用它们。请注意这个问题纯粹是学习Yii 2的一部分。请举例说明。提前谢谢。
答案 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
}