Флажок symfony2 many-to-many
У меня в symfony создано 2 объекта: User и Role во многих отношениях. Это означает, что у каждого пользователя может быть больше ролей и ролей, которые могут быть установлены для многих пользователей.
Класс пользователя:
/**
* @ORM\Entity
* @ORM\Table(name="JEP_User")
* @ORM\Entity(repositoryClass="Chrchel\JepBundle\Repository\UserRepository")
*/
class User implements AdvancedUserInterface {
/**
* @ORM\Id()
* @ORM\Column(name="id",type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="username",type="string",length=100,unique=true)
*/
private $username;
/**
* @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
*
*/
protected $roles;
//....
}
Класс ролей:
/**
* @ORM\Table(name="JEP_Role")
* @ORM\Entity()
*/
class Role implements RoleInterface {
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/** @ORM\Column(name="name", type="string", length=30) */
protected $name;
/** @ORM\Column(name="role", type="string", length=20, unique=true) */
protected $role;
/** @ORM\ManyToMany(targetEntity="User", mappedBy="roles") */
protected $users;
//...
}
Я не могу понять, как составить построитель запросов в Symfony2, чтобы отобразить все существующие роли и добавить его в конец UserForm, где могут быть выбраны роли (роли), предоставленные пользователю.
Я попытался использовать такую коллекцию в UserType
->add('roles', 'collection',array('label' => 'Role', 'required' => false,'type'=> new RoleType()))
Лучшее, что я получаю от symfony, - это строки с текстовыми полями с выбранными именами ролей. Но это не то, что мне нужно.
Ответы
Ответ 1
Я использовал тип сущности вместо коллекции. Я обычно собираюсь в основном создавать объект Role
и назначать его User
.
Если вы хотите просто перечислить все существующие роли и сможете выбрать и назначить его пользователю, выполните следующие действия:
->add('roles', 'entity', array(
'class' => 'MyBundle:Role',
'property' => 'name',
'multiple' => true
));
EDIT: это приведет к тому, что виджет станет несколько <select>
, обратитесь к тип сущности, чтобы отобразить как Список флажков.
Ответ 2
@user1041880: Если вы используете функции безопасности symfony (для которых нужны роли euser в качестве массива), вы можете сделать это следующим образом:
->add('rolesAsCollection', 'entity', array(
'class' => 'MyBundle:Role',
'property' => 'name',
'multiple' => true
));
И в вашем пользовательском классе:
public function getRolesAsCollection()
{
return $this->roles;
}
Ответ 3
Symfony3:
Если кто-то использует Symfony3:
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
->add('roles', EntityType::class, array( // <-- EntityType::class is unique to Symfony3
'class' => 'AppBundle:Role',
'choice_label' => 'name', // <-- choice_label is unique to Symfony3
'multiple' => true
))