Как изменить разрешения пользователей в symfony 2 с помощью формы?


У меня возникла проблема с созданием новой/редактируемой формы пользователя в symfony 2+FOSUserBundle. Я хотел бы разрешить администратору выбирать роль пользователя из выпадающего списка или списка переключателей, но, похоже, я не могу заставить ее работать. Я нашел этот ответ здесь Как я могу передать полный список/иерархию ролей безопасности классу FormType в Symfony2? это самое важное, что я мог найти, но это не работает.

Это форма типа пользователя в ее нынешнем виде. Я хотел бы получить роли из контейнера, но я, похоже, не могу заставить это работать без того, чтобы это не вызвало ошибку. Роли правильно заполнят раскрывающийся список, но он не покажет, какая роль назначена в данный момент, и не позволит обновлять информацию, поскольку ожидалось, что это будет массив $entity->addRoles(array('ROLE_SUPER_ADMIN'));, но он просто отправляется в виде строки.

namespace Wes\AdminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UserType extends AbstractType
{
    private $roles;

    public function __construct($roles) {
        $this->roles = $roles;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username')
            ->add('email')
            ->add('enabled')
            ->add('roles', 'choice', array(
               'choices' => $this->flattenArray($this->roles),
            ))
            ->add('firstName')
            ->add('lastName')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Wes\AdminBundle\Entity\User',
            'roles' => null,
            'userRole' => null,
        ));
    }

    public function getName()
    {
        return 'wes_adminbundle_usertype';
    }

    private function flattenArray(array $data)
    {
        $returnData = array();

        foreach($data as $key => $value)
        {
            $tempValue = str_replace("ROLE_", '', $key);
            $tempValue = ucwords(strtolower(str_replace("_", ' ', $tempValue)));
            $returnData[$key] = $tempValue;
        }
        return $returnData;
    }
}

Это контроллер.

public function editAction($id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('WesAdminBundle:User')->find($id);
    if (!$entity) {
        throw $this->createNotFoundException('Unable to find User entity.');
    }

    $editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity);
    $deleteForm = $this->createDeleteForm($id);

    return $this->render('WesAdminBundle:User:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

/**
 * Edits an existing User entity.
 *
 */
public function updateAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('WesAdminBundle:User')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find User entity.');
    }

    $deleteForm = $this->createDeleteForm($id);
    $editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $entity);
    $editForm->bind($request);

    if ($editForm->isValid()) {
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('wes_admin_user_edit', array('id' => $id)));
    }

    return $this->render('WesAdminBundle:User:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

Я борюсь с этим уже несколько дней и, похоже, не могу заставить его работать должным образом. Какой-нибудь мысли?

Author: Community, 2013-01-11

1 answers

Используйте менеджер пользователей, предоставляемый FOSUserBundle, вместо пользовательского метода сохранения, поскольку массив ролей необходимо сериализовать, прежде чем он будет сохранен в базе данных.

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->findUserBy(array('id' => $id));

$editForm = $this->createForm(new UserType($this->container->getParameter('security.role_hierarchy.roles')), $user);

if ($editForm->isValid()) {
    $userManager->updateUser($user);

    return $this->redirect($this->generateUrl('wes_admin_user_edit',
        array('id' => $id)));
}

См. https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/user_manager.rst{[6] } (отредактировано) для получения дополнительной информации.

 3
Author: ihsan, 2016-07-11 14:51:40