如何在Symfony2中为用户分配默认角色


How can I assign default role to user in Symfony2

我想在用户注册后为其分配默认角色。我已经实现了SonataUserBundle扩展的FOSUserBundle。不幸的是,SonataUserBundle需要FOSUserBundle ~1.3,而事件侦听器仅在FOSUserBundle 2.0之后。

除了eventListener或FOSUserBundle控制器覆盖之外,还有其他方法可以解决这个问题吗?也许我错过了yaml的某种选择?这似乎是一个很标准的问题,但我对symfony2…

还是个新手

您可以使用如下的prePersist方法:

/**
 * @ORM'Entity
 * @ORM'Table(name="user_users")
 * @ORM'HasLifecycleCallbacks()
 */
class User extends BaseUser
{   
    ...
    /**
     * @ORM'PrePersist()
     */
    public function setDefaultRole(){
        $this->addRole( 'ROLE_NAME' );
    }
}

在创建User元素时,prePersist将在实体存储在数据库中之前启动。你可以在中阅读http://docs.doctrine-project.org/en/2.0.x/reference/events.html

虽然来得晚,但您可以简单地覆盖User类的构造函数。我想你延长了Sonata'UserBundle'Entity'BaseUser,所以你的代码应该是:

namespace Acme'UserBundle'Entity;
use Sonata'UserBundle'Entity'BaseUser as BaseUser;
class User extends BaseUser
 {
    public function __construct()
    {
        parent::__construct();
        $this->roles = array('ROLE_ADMIN');
    }
}

在分配角色之前,您必须使用parent::_construct,否则Sonata注册控制器将覆盖您的角色。希望有帮助:(

您可以覆盖用户类的getRoles((方法:

public function getRoles()
{
    $roles = parent::getRoles();
    if ($this->enabled) {
        switch ($this->type) {
            case self::TYPE_1:
                 $roles[] = 'ROLE_TYPE_1';
                 break;
            case self::TYPE_2:
                 $roles[] = 'ROLE_TYPE_2';
                 break;
        }
    }
    return array_unique($roles);
}

编辑:按用户类型添加角色