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:

  1. 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
    
  2. 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.

  1. 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.

Foi útil?

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 ...
        }
    });
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top