Fosuserbundle показывают роли группы в редактировании
-
20-12-2019 - |
Вопрос
Я пытаюсь переопределить контроллер и formtype, чтобы показать роли из выбранной группы на мой взгляд, но я не нахожу правильно. Я последовал за шагами, чтобы переопределить все, что работает, но проблема приходит, когда я пытаюсь сказать услугу, что я передаю конструктору объекта объекта.
Поскольку formtype должен быть переопределен, как пройти через сервис, который вам нужно реализовать, мою группу entity?
У кого-нибудь есть идея того, как достичь этого?
Вот что я сделал:
-
Переопределите контроллер, а при создании формы пройдите объект
$group
$formFactory = $this->container->get('fos_user.group.form.factory'); $form = $formFactory->createForm($group); //Here
-
переопределяют форму и используйте пользовательский метод __Construct, где я могу пройти мою сущность (может быть, здесь моя ошибка, и это должно быть сделано в лучшем или ином способе)
public function __construct(Container $container, Groups $group) { $this->container = $container; $this->roles = array_keys($this->container->getParameter('security.role_hierarchy.roles')); $this->group = $group; #How? }
-
Создайте службу, поскольку документация говорит (здесь приходит реальная проблема и исключения)
x_s_cosmos.group.form.type: class: X\S\CosmosBundle\Form\Type\GroupFormType arguments: [@service_container, here_should_be_my_entity?] tags: - { name: form.type, alias: kosmos_group_form }
Контейнер для получения ключей для ролей передается без ошибок, это работает.
Я действительно сложен с этим и не имею никакого представления о том, как продолжать.
Решение
Наконец, после переопределения GroupController.php и добавление типа поля выбора в мою форму, я мог бы достичь моей цели.
$form->add('roles', 'choice', array(
'choices' => $this->getExistingRoles(),
'data' => $group->getRoles(),
'label' => 'Roles',
'expanded' => true,
'multiple' => true,
'mapped' => true,
));
.
Где getexistrationroles ():
$roleHierarchy = $this->container->getParameter('security.role_hierarchy.roles');
$roles = array_keys($roleHierarchy);
foreach ($roles as $role) {
$theRoles[$role] = $role;
}
return $theRoles;
.
Я просто пошел неправильно, было не так сложно получить роли группы и показать их в интерфейсе администратора, чтобы вы могли выбрать одну из ваших системных ролей и дать ее группе.Не нужно переопределить FormType, просто контроллер, чтобы добавить свои собственные поля в форму.
Надеюсь, это поможет, как это дало мне большую головную боль.
Другие советы
Вы не должны передавать сущность к конструктору.Если вам нужно получить доступ к объекту внутри формы, вы должны добавить слушатель события в форм-строитель, как это:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$form = $event->getForm();
$entity = $event->getData();
// This is your Group entity, now do something with it...
if ($entity instanceof Group) {
// $form->add ...
}
});
}
.