2015-11-04 4 views
2

У меня проблема, рано моя сущность имеет одну роль, и это достаточно для проекта. Но теперь моя сущность нуждается в такой роли, как ROLE_DEVELOPER, ROLE_COMPANY, и когда пользователь выполняет некоторую операцию для сущности, добавляет новую роль. И как наилучшим образом для этой ситуации, создать новую сущность или изменить роль поля в массиве или что? У меня есть объект в пользователе таблицы и есть один ROLE_USER, и теперь пользователь хочет создать команду, для команды нужна роль ROLE_TEAM и как установить новую роль? Затем пользователь хочет создать клиентский объект, и мне нужно установить ROLE_CLIENT. Если я создаю отношение ManyToMany, как мой пользователь, у которого есть много полномочий аутентификации? И в профиле пользователя я хочу создать, если у пользователя есть ROLE_TEAM - видимая кнопка для перехода в команду профиля, buut его много роли, мне нужны роли в foreach array?Symfony много роли для пользователя

/** 
* Users 
* 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\UsersRepository") 
* @ExclusionPolicy("all") 
*/ 

class Users implements UserInterface 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @Expose() 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @Gedmo\Slug(fields={"firstName", "lastName"}, separator="-", updatable=true) 
* @ORM\Column(name="name", type="string", options={"default": "Company"}, length=255, nullable=false) 
* @Assert\Length(min=3, max=255) 
*/ 
protected $username; 

/** 
* @var string 
* 
* @ORM\Column(name="password", type="string", length=80, nullable=true) 
*/ 
protected $password; 

/** 
* @ORM\ManyToMany(targetEntity="Role") 
* @ORM\JoinTable(name="user_role", 
*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} 
*) 
* 
* @var ArrayCollection $userRoles 
*/ 
protected $userRoles; 

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->userRoles = new ArrayCollection(); 
} 

/** 
* Get salt 
* 
* @return string 
*/ 
public function getSalt() 
{ 
    return ''; 
} 

/** 
* @inheritDoc 
*/ 
public function eraseCredentials() { } 

/** 
* Геттер для ролей пользователя. 
* 
* @return ArrayCollection A Doctrine ArrayCollection 
*/ 
public function getUserRoles() 
{ 
    return $this->userRoles; 
} 

/** 
* Геттер для массива ролей. 
* 
* @return array An array of Role objects 
*/ 
public function getRoles() 
{ 
    return $this->getUserRoles()->toArray(); 
} 
} 

организация Роль

/** 
* @ORM\Entity 
* @ORM\Table(name="role") 
*/ 
class Role implements RoleInterface 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
* 
* @var integer $id 
*/ 
protected $id; 

/** 
* @ORM\Column(type="string", length=255) 
* 
* @var string $name 
*/ 
protected $name; 

/** 
* @ORM\Column(type="datetime", name="created_at") 
* 
* @var DateTime $createdAt 
*/ 
protected $createdAt; 

/** 
* Геттер для id. 
* 
* @return integer The id. 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Геттер для названия роли. 
* 
* @return string The name. 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Сеттер для названия роли. 
* 
* @param string $value The name. 
*/ 
public function setName($value) 
{ 
    $this->name = $value; 
} 

/** 
* Геттер для даты создания роли. 
* 
* @return DateTime A DateTime object. 
*/ 
public function getCreatedAt() 
{ 
    return $this->createdAt; 
} 

/** 
* Конструктор класса 
*/ 
public function __construct() 
{ 
    $this->createdAt = new \DateTime(); 
} 

/** 
* Реализация метода, требуемого интерфейсом RoleInterface. 
* 
* @return string The role. 
*/ 
public function getRole() 
{ 
    return $this->getName(); 
} 
} 

теперь я клеть светильники, но есть ошибка:

Artel\ProfileBundle\Entity\Role: 
role0: 
name: 'ROLE_FREELANCER' 
role1: 
name: 'ROLE_COMPANY' 
role2: 
name: 'ROLE_DEVELOPER' 

    Artel\ProfileBundle\Entity\Users: 
users0: 
........ 
userRoles: @role0 

users{1..100}: 
....... 
userRoles: 2x @role* 

[Symfony\Component\Debug\Exception\ContextErrorException]                                                 
Catchable Fatal Error: Argument 1 passed to Doctrine\Common\Collections \ArrayCollection::__construct() must be of the type array, object given, called in /var/www/aog-code/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 605 and defined 

ответ

4

Во-первых, вы можете использовать hierarchical roles, так что вы можете добавить в свой конфигурационный что-то вроде:

# app/config/security.yml 
security: 
    # ... 

    role_hierarchy: 
     ROLE_DEVELOPER:  ROLE_USER 
     ROLE_COMPANY: [ROLE_ADMIN, ROLE_DEVELOPER] 

Это означает, что если пользователь имеет ROLE_COMPANY, он также ROLE_ADMIN, ROLE_DEVELOPER и ROLE_USER (потому что ROLE_DEVELOPER имеет ROLE_USER)

В случае, если вы хотите иметь отдельные роли для каждый пользователь, вы можете создать Объект ролей, который должен реализовать Symfony \ Component \ Security \ Core \ Role \ RoleInterface.

Тогда вы можете просто создать много-ко-многим между ссылкой Роль и пользователя.

Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

+0

обновите свой вопрос и напишите вам чат. Как создать алименты для этой структуры? И обязательно соберите новую роль таблицы и отношение ManyToMany или просто создайте поле userRole = []? –

Смежные вопросы