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

时间:2014-05-17 14:55:59

标签: php symfony fosuserbundle sonata-user-bundle

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

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

3 个答案:

答案 0 :(得分:1)

您可以使用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

中了解相关信息

答案 1 :(得分:1)

迟到但您可以简单地覆盖User类的构造函数。我假设你延长了 self.inputSpace = np.array(generateDist(i,j,k).tolist()) 所以你的代码应该是:

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'); } } ,否则Sonata注册控制器将覆盖您的角色。希望它有所帮助:)

答案 2 :(得分:0)

您可以覆盖用户类的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);
}

编辑:为每个用户类型添加角色