Предположим, у меня есть сущность competence
, то есть ManyToMany, связанная с сущностью location
. Кроме того, есть users
, которые имеют доступ только к одному местоположению.
Теперь представьте себе следующий сценарий: Компетенция FirstHelp
связана с местоположениями Berlin
и Munich
. Пользователь Bob
имеет доступ к местоположению Berlin
. Bob
теперь хочет редактировать FirstHelp
. Ему должно быть разрешено удалить или добавить отношение между FirstHelp
и Berlin
, но ему следует не разрешить касаться отношения FirstHelp
<=> Munich
. Ему также не разрешается добавлять другие отношения, такие как FirstHelp
<=> Cologne
.
Пока у меня есть CompetenceType
с полем EntityType:
class CompetenceType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
'locations',
EntityType::class,
[
'class' => Location::class,
'choice_label' => 'name',
'multiple' => true,
'expanded' => true,
'label' => "Locations",
]
);
}
}
Как настроить форму таким образом, чтобы Bob
не мог изменить отношение Munich
, но может изменить отношение Berlin
?
Я попытался отключить опцию Munich
с помощью обратного вызова choice_attr
, однако это всегда приводит к удалению отношения Munich
.
Я также пытался использовать query_builder
для извлечения только сущности Berlin
, но, как и в приведенном выше решении, это всегда приводит к удалению отношения Munich
.
Третья идея состояла в том, чтобы установить by_reference
на false
и затем соответствующим образом изменить сумматоры и съемники. я не мог использовать это решение, потому что у меня нет доступа к контейнеру внутри сущности и, следовательно, я не могу проверить, имеет ли Bob
право манипулировать всеми отношениями вместо одного из его собственного местоположения.
Пожалуйста, обратите внимание: я хотел бы иметь решение, которое не связано с контроллером. Я знаю, что мог бы потом просто добавить отношение Munich
через контроллер, но это было бы просто грязным хаком. По моему мнению, это должно быть единоличной ответственностью формы, чтобы справиться с этим.