Php 用户与RBAC中的后存储方法

Php 用户与RBAC中的后存储方法,php,database,yii2,rbac,Php,Database,Yii2,Rbac,我试图在注册表单时为用户分配角色(RBAC) public function signup() { if (!$this->validate()) { return null; } $user = new User(); $user->username = $this->username; $user->email = $this->email; $user->role = $this->

我试图在注册表单时为用户分配角色(RBAC)

public function signup()
{
    if (!$this->validate()) {
        return null;
    }

    $user = new User();
    $user->username = $this->username;
    $user->email = $this->email;
    $user->role = $this->role;
    $user->setPassword($this->password);
    $user->generateAuthKey();

    return $user->save() ? $user : null;

    $myRole = '';

    switch ($user->role) {
        case 0:
            $myRole = 'developer';
            break;
        case 1:
            $myRole = 'project_manager';
            break;
        case 2:
            $myRole = 'customer';
            break;
    }

    $auth = Yii::$app->authManager;
    $role = $auth->getRole($myRole);
    $auth->assign($role, $user->id);

    return true;

}
查看注册

 <?= $form->field($model, 'role')->dropDownList(
                    [
                    '0' => 'Developer',
                    '1' => 'Project Manager',
                    '2' => 'Customer'
                    ],
                    ['prompt' => 'Choose your role..']) ?>
它很好用。。。
谁能解释为什么会这样?

< p>你在这个方法的中间有一个<代码>返回<代码>,所以在<代码>之后的所有东西都返回$Uper->SaveE()?$用户:空是一个死代码

您可能需要将其替换为:

if (!$model->save()) {
    return null;
}

在这个方法的中间,你有一个<代码>返回<代码>,所以在<代码>之后的所有东西都返回$Auth->SaveE()?$用户:空是一个死代码

您可能需要将其替换为:

if (!$model->save()) {
    return null;
}

我认为这与此有很大关系

return $user->save() ? $user : null;
您将在save()方法或null之后返回用户,因此在此之后编写的任何代码都不会实际执行

如果要仅在保存成功后分配角色,可以这样做:

if (!$this->validate()) {
        return null;
    }

    $user = new User();
    $user->username = $this->username;
    $user->email = $this->email;
    $user->role = $this->role;
    $user->setPassword($this->password);
    $user->generateAuthKey();

    if($user->save())
    {

      $myRole = '';

      switch ($user->role) {
          case 0:
              $myRole = 'developer';
              break;
          case 1:
              $myRole = 'project_manager';
              break;
          case 2:
              $myRole = 'customer';
              break;
      }

      $auth = Yii::$app->authManager;
      $role = $auth->getRole($myRole);
      $auth->assign($role, $user->id);

      return true;
    }
    else
      return false;

我认为这与此有很大关系

return $user->save() ? $user : null;
您将在save()方法或null之后返回用户,因此在此之后编写的任何代码都不会实际执行

如果要仅在保存成功后分配角色,可以这样做:

if (!$this->validate()) {
        return null;
    }

    $user = new User();
    $user->username = $this->username;
    $user->email = $this->email;
    $user->role = $this->role;
    $user->setPassword($this->password);
    $user->generateAuthKey();

    if($user->save())
    {

      $myRole = '';

      switch ($user->role) {
          case 0:
              $myRole = 'developer';
              break;
          case 1:
              $myRole = 'project_manager';
              break;
          case 2:
              $myRole = 'customer';
              break;
      }

      $auth = Yii::$app->authManager;
      $role = $auth->getRole($myRole);
      $auth->assign($role, $user->id);

      return true;
    }
    else
      return false;

下面的答案中已经提到了这一点,除非你有其他建议,否则不要发布答案。很抱歉,如果这让你感到困扰,但是,在我看来,当我还在写我的答案时,另一个人发送了他们的答案。这可能是因为我的答案更长。但是,它还是想帮助OP实现最初的意图,在用户创建后保存角色。没关系,它只是创建了一个重复的帖子,这就是我所担心的,有时我们没有意识到已经发布了相同的答案,不用担心。只是想让你知道,下面的答案中已经提到了这一点,除非你有其他建议,否则不要发布答案哦,如果这让你有任何困扰,我很抱歉,然而,在我看来,当我还在写我的答案时,另一个人发送了他们的答案。这可能是因为我的答案更长。但是,它还是想帮助OP实现最初的意图,在用户创建后保存角色。没关系,它只是创建了一个重复的帖子,这就是我所担心的,有时我们不知道已经发布了相同的答案,不用担心。只是想让你知道我更新了我的答案,尝试用我的代码替换你的
return
。我更新了我的答案,尝试用我的代码替换你的
return