我想在注册后为用户分配默认角色。我已经实现了SonataUserBundle扩展的FOSUserBundle。不幸的是,SonataUserBundle需要FOSUserBundle~1.3,而事件监听器只是自FOSUserBundle 2.0以来。
除了eventListener或FOSUserBundle控制器覆盖之外,还有其他方法可以解决此问题吗?也许我错过了yaml中的某种选择?这似乎是一个非常标准的问题,但我仍然是symfony2的新手......
答案 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);
}
编辑:为每个用户类型添加角色