如何使用Yii2中的基本模板为用户分配角色?

如何使用Yii2中的基本模板为用户分配角色?,yii2,rbac,Yii2,Rbac,在文档中,它说您可以使用以下代码在高级模板中将角色分配给用户: public function signup() { if ($this->validate()) { $user = new User(); $user->username = $this->username; $user->email = $this->email; $user->setPassword($this->

在文档中,它说您可以使用以下代码在高级模板中将角色分配给用户:

public function signup()
{
    if ($this->validate()) {
        $user = new User();
        $user->username = $this->username;
        $user->email = $this->email;
        $user->setPassword($this->password);
        $user->generateAuthKey();
        $user->save(false);

        // the following three lines were added:
        $auth = Yii::$app->authManager;
        $authorRole = $auth->getRole('author');
        $auth->assign($authorRole, $user->getId());

        return $user;
    }

    return null;
}
问题是我使用的是基本模板。在基本模板中是否有这样做的方法

我考虑过使用余波法;然而,我不知道如何做到这一点

public function afterSave($insert)
{

}
你知道怎么做吗

public function afterSave($insert)
{
    $auth = Yii::$app->authManager;
    $authorRole = $auth->getRole('author');
    $auth->assign($authorRole, $this->Id());
}

我认为这可能有效,但我不能完全确定。

它不依赖于使用的模板

你的例子是正确的,除了几件事

$this->Id()
应替换为
$this->Id
(假设users表的主键名为
Id

请注意,您还需要调用
afterSave()
方法的父实现,而您遗漏了
$changedAttributes
参数:

/**
 * @inheritdoc
 */ 
public function afterSave($insert, $changedAttributes)
{
    $auth = Yii::$app->authManager;
    $authorRole = $auth->getRole('author');
    $auth->assign($authorRole, $this->id);

    parent::afterSave($insert, $changedAttributes);
}
为了进一步改进,您可以将保存包装到事务中,这样,如果在
afterSave()
中出现故障,则不会保存模型(
afterSave()
事件处理程序在将模型保存到数据库中后执行)

此外,您还可以将分配角色逻辑移动到单独的方法

请注意,使用此逻辑,每个注册用户都将拥有该角色。您可以使用一些条件来包装它,但是最好通过管理界面来分配角色

例如,您可以在中看到它是如何实现的。例如,您可以创建单独的表单、操作和扩展
GridView
ActionColumn
,以及用于分配角色的附加图标