如何在数据库中存储角色? 我尝试了这个方法http://blog.jmoz.co.uk/symfony2-fosuserbundle-role-entities/
用户.php
/**
* @ORM\Entity
* @ORM\Table(name="`user`")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="author")
*/
public $article;
/**
* @var string
*
* @ORM\Column(name="full_name", type="string", length=255, nullable=true)
*/
public $name;
/**
* @ORM\ManyToMany(targetEntity="Role")
* @ORM\JoinTable(name="users_roles")
*/
protected $roles;
public function __construct()
{
parent::__construct();
$this->roles = new ArrayCollection();
}
....settings...
/**
* Returns an ARRAY of Role objects with the default Role object appended.
* @return array
*/
public function getRoles()
{
return array_merge($this->roles->toArray(), array(new Role(parent::ROLE_DEFAULT)));
}
/**
* Returns the true ArrayCollection of Roles.
* @return ArrayCollection
*/
public function getRolesCollection()
{
return $this->roles;
}
/**
* Pass a string, get the desired Role object or null.
* @param string $role
* @return Role|null
*/
public function getRole($role)
{
foreach ($this->getRoles() as $roleItem) {
if ($role == $roleItem->getRole()) {
return $roleItem;
}
}
return null;
}
/**
* Pass a string, checks if we have that Role. Same functionality as getRole() except returns a real boolean.
* @param string $role
* @return boolean
*/
public function hasRole($role)
{
if ($this->getRole($role)) {
return true;
}
return false;
}
/**
* Adds a Role OBJECT to the ArrayCollection. Can't type hint due to interface so throws Exception.
* @throws Exception
* @param Role $role
*/
public function addRole($role)
{
if (!$role instanceof Role) {
throw new \Exception("addRole takes a Role object as the parameter");
}
if (!$this->hasRole($role->getRole())) {
$this->roles->add($role);
}
}
/**
* Pass a string, remove the Role object from collection.
* @param string $role
*/
public function removeRole($role)
{
$roleElement = $this->getRole($role);
if ($roleElement) {
$this->roles->removeElement($roleElement);
}
}
/**
* Pass an ARRAY of Role objects and will clear the collection and re-set it with new Roles.
* Type hinted array due to interface.
* @param array $roles Of Role objects.
*/
public function setRoles(array $roles)
{
$this->roles->clear();
foreach ($roles as $role) {
$this->addRole($role);
}
}
/**
* Directly set the ArrayCollection of Roles. Type hinted as Collection which is the parent of (Array|Persistent)Collection.
* @param Collection $role
*/
public function setRolesCollection(Collection $collection)
{
$this->roles = $collection;
}
}
角色.php
/**
* Role Entity
*
* @ORM\Entity
* @ORM\Table(name="roles")
*/
class Role implements RoleInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer", name="id")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", name="role", unique=true, length=70)
*/
private $role;
/**
* Populate the role field
* @param string $role ROLE_FOO etc
*/
public function __construct($role)
{
$this->role = $role;
}
/**
* Return the role field.
* @return string
*/
public function getRole()
{
return $this->role;
}
/**
* Return the role field.
* @return string
*/
public function __toString()
{
return (string)$this->role;
}
}
我总是收到此错误。
[学说\ORM\Mapping\MappingException]
“***\Entity\User”中的属性“角色”已经 声明,但只能声明一次
有人可以帮助我吗?
谢谢
您需要删除
roles
实体内与 User
相关的所有内容。开箱即用的捆绑包支持角色。
我刚刚设置了捆绑包,一切正常。这就是我的
User
实体的样子,它扩展了 BaseUser
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User extends BaseUser
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
}
一旦捆绑包设置,我就运行架构更新命令。
如您所见,角色
column
是通过捆绑包自动添加的。
您可以使用附带的命令来尝试捆绑包来创建用户。