在我的项目中,我有两个实体:Group
和Permission
,这些实体已链接在一起。我在为Group Entity创建表单时遇到问题。我是Symfony的新手,所以我可能会想念一些简单的东西。
我有一个»AppReset«命令来初始化应用程序,在那里,Permissions表填充了固定数量的条目,看起来像这样(n = 9):
# | Name | type
--------------------------------
1 | VIEW | type1
2 | EDIT | type1
…
n | MASTER | type1
--------------------------------
n+1 | VIEW | type2
…
2n | MASTER | type2
2n+1| VIEW | type3
…
4n | MASTER | type4
因此每个组最多可以拥有28个权限。在一个组的编辑表单中,我想有一个名为权限的部分,它本身应该显示如下:
PERMISSIONS:
type1:
checkbox#1 (checked if group has this) VIEW
checkbox#2 (unchecked if not) EDIT
…
checkbox#n MASTER
type2:
…
type4:
…
checkbox#4n MASTER
请查看我到目前为止的以下代码。有两个主要问题:
mapped
,或者没有正确映射?这是实体的代码:
Group.php(缩短)
<?php
namespace AppBundle\Entity;
class Group implements RoleInterface
/**
* @ORM\ManyToMany(targetEntity="Permission")
* @ORM\JoinTable(name="app_groups_permissions",
* joinColumns={
* @ORM\JoinColumn(name="group_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="permission_id", referencedColumnName="id", unique=true)
* }
* )
*/
private $permissions;
public function __construct() {
$this->permissions = new ArrayCollection();
}
public function getPermissions() {
return $this->permissions;
}
/**
* @param Permission $permission
*/
public function addPermission(Permission $permission) {
if($this->permissions->contains($permission)) {
return;
}
$this->permissions->add($permission);
return $this;
}
/**
* @param Permission $permission
*/
public function removePermission(Permission $permission) {
if (!$this->permissions->contains($permission)) {
return;
}
$this->permissions->removeElement($permission);
return $this;
}
}
Permission.php(缩短)
namespace AppBundle\Entity;
class Permission
{
//»default« primary id field
//simple string fields (name, mask, type)
}
GroupType.php :: buildForm
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name', TextType::class)
->add('permissions', PermissionsType::class, ['groups' => [$builder->getData()]])
->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit'])
->add('save', SubmitType::class);
}
PermissionType.php :: buildForm
public function buildForm(FormBuilderInterface $builder, array $options)
{
foreach($options['groups'] as $group) {
$name = is_null($group->getId()) ? '0' : $group->getId();
$builder->add($name, ChoiceType::class, [
'mapped' => false,
'multiple' => true,
'expanded' => true,
'label' => $group->getName(),
'choices' => $this->permissions,
'choice_value' => 'id',
'choice_label' => 'name',
'data' => array_reduce($this->permissions,
function($map, $perm) use($group)
{
if($group->getPermissions()->contains($perm)) $map[] = $perm;
return $map;
},[])
]);
}
}