FOSUserBundle mostra funções de grupo na visualização de edição
-
20-12-2019 - |
Pergunta
Estou tentando substituir o controlador e o formtype, para mostrar os papéis do grupo selecionado na minha visão, mas não encontro o caminho certo.Segui os passos para substituir tudo, funciona, mas o problema surge quando tento dizer ao serviço que estou passando para o construtor um objeto de entidade.
Como o formtype tem que ser sobrescrito, como passar pelo serviço que você precisa implementar, minha entidade Grupo?
Alguém tem uma idéia de como conseguir isso?
Aqui está o que eu fiz:
Substitua o controlador e, ao criar o Form, passe o
$group
entidade$formFactory = $this->container->get('fos_user.group.form.factory'); $form = $formFactory->createForm($group); //Here
Substitua o formulário e use um método __construct personalizado onde eu possa passar minha entidade (talvez aqui esteja o meu erro e isso deva ser feito de uma maneira melhor ou de outra forma)
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? }
O contêiner para obter as chaves dos papéis é passado sem erros, isso funciona.
Crie o serviço como diz a documentação (aí vem o verdadeiro problema e as exceções)
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 }
Estou realmente cheio disso e não tenho ideia de como continuar.
Solução
Finalmente, depois de substituir GroupController.php e adicionar um tipo de campo de escolha ao meu formulário, consegui atingir meu objetivo.
$form->add('roles', 'choice', array(
'choices' => $this->getExistingRoles(),
'data' => $group->getRoles(),
'label' => 'Roles',
'expanded' => true,
'multiple' => true,
'mapped' => true,
));
Onde getExistingRoles() está:
$roleHierarchy = $this->container->getParameter('security.role_hierarchy.roles');
$roles = array_keys($roleHierarchy);
foreach ($roles as $role) {
$theRoles[$role] = $role;
}
return $theRoles;
Eu estava indo na direção errada, não foi tão difícil obter as funções de um grupo e mostrá-las em uma interface administrativa para que você possa escolher uma das funções do sistema e entregá-la ao grupo.Não há necessidade de substituir o FormType, apenas o controlador para adicionar seus próprios campos ao formulário.
Espero que ajude, pois me deu muita dor de cabeça.
Outras dicas
Você não deve passar uma entidade para o construtor.Se você precisar acessar a entidade dentro do formulário, será necessário adicionar um ouvinte de evento ao construtor de formulário, assim:
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 ...
}
});
}