我想在用户注册后为其分配默认角色。我已经实现了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);
}
编辑:按用户类型添加角色