Symfony отключил опции для EntityType - PullRequest
0 голосов
/ 24 апреля 2019

Предположим, у меня есть сущность 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 через контроллер, но это было бы просто грязным хаком. По моему мнению, это должно быть единоличной ответственностью формы, чтобы справиться с этим.

1 Ответ

1 голос
/ 24 апреля 2019

Я бы сказал, только одна форма может нести вас до сих пор.Тем не менее, ...

Чтобы справиться с этой не такой простой задачей, используя только EntityType.Чтобы форма несла все это?EntityType предназначен для обработки набора единообразных вещей.

Мой подход заключается в том, чтобы обрабатывать объекты (или ссылки, или что-то еще) избирательно: те, которые можно редактировать, и те, которые нельзя редактировать.Я бы использовал DataMapper , чтобы разделить сущностей на эти две группы, одну можно отключить (или полностью исключить), а другую можно отредактировать и прочее,все что тебе нужно.В обратном направлении (DataMapper::mapFormsToData) вы должны в некоторой степени правильно управлять коллекцией, чтобы удалять / добавлять / редактировать соответствующие объекты, но я считаю, что вы получаете исходный объект по ссылке, и он должен работать нормально.Однако я никогда не делал этого ...

Если вы показываете отключенные объекты, вы можете , вероятно, полагаться на отключенную форму, чтобы отрицать любые изменения в объектах, которые не должны бытьизменилось.

Итак, в итоге:

  • внедрите DataMapperInterface в типе вашей формы
  • в mapDataToForms вы отфильтруете не /редактируемые объекты в одно поле для редактирования
  • в mapFormsToData необходимо снова отфильтровать нередактируемые объекты, чтобы можно было определить, какие объекты нужно добавить / удалить / редактировать

Надеюсь, это поможет ... или, по крайней мере, обеспечит подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...