如何使用 FriendsOfSymfony UserBundle 创建表单来编辑用户角色

How to create a form to edit user roles with FriendsOfSymfony UserBundle

我正在尝试创建一个控制器,我可以在其中编辑用户的角色(仅此而已,没有别的),但我被困住了。

我创建了一个表单类型:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'roles', 'choice', [
                'choices' => ['ROLE_ADMIN', 'ROLE_USER', 'ROLE_CUSTOMER'],
                'expanded' => true,
                'multiple' => true,
            ]
        )
        ->add('send', 'submit');
}

首先,检索角色的最佳方式是什么?有什么方法可以将标签与它们相关联吗?

在控制器中我有这个:

/**
     * User role edition
     *
     * @Route(
     *      path="/edit-roles",
     *      name = "backoffice_user_edit_roles",
     *      requirements = {
     *          "id_user" = "\d*",
     *      },
     *      methods = {"GET"}
     * )
     *
     * @Security("has_role('ROLE_ADMIN')")
     *
     * @Template
     */
    public function editRolesAction($id_user)
    {
        $user = $this->user_repository->findOneById($id_user);
        $form = $this->form_factory->create('dirital_user_roles_form_type', $user);
        return [
            'form' => $form->createView(),
            'user' => $user
        ];
    }

我遇到的问题:

非常感谢

实际上它比我想象的要容易 - 这是表格:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'roles', 'choice', [
                'choices' => ['ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_USER' => 'ROLE_USER', 'ROLE_CUSTOMER' => 'ROLE_CUSTOMER'],
                'expanded' => true,
                'multiple' => true,
            ]
        )
        ->add('save', 'submit', ['label' => 'ui.button.save']);
}

控制器:

public function editRolesAction(Request $request, $id_user)
{
    $user = $this->user_repository->findOneById($id_user);
    $form = $this->form_factory->create('dirital_user_roles_form_type', $user);
    $form->handleRequest($request);
    if($form->isValid())
    {
        $this->addFlash('success', 'section.backoffice.users.edit_roles.confirmation');
        $this->em->persist($user);
        $this->em->flush();
        $this->redirectToRoute('backoffice_user_edit_roles', ['id_user' => $user->getId()]);
    }
    return [
        'form' => $form->createView(),
        'user' => $user
    ];
}

剩下要做的唯一部分是从配置中获取表单选项,而不是对它们进行硬编码。

为了方便在其他控制器或动作中复用,我比较喜欢这种方式:

<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\CallbackTransformer;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add(
                'roles', 'choice', [
                    'choices' => ['ROLE_ADMIN' => 'ROLE_ADMIN', 'ROLE_USER' => 'ROLE_USER', 'ROLE_CUSTOMER' => 'ROLE_CUSTOMER'],
                    'expanded' => true,
                    'multiple' => true,
                ]
            )
            ->add('save', 'submit', ['label' => 'ui.button.save']);
        ;

        // Data transformer
        $builder->get('roles')
            ->addModelTransformer(new CallbackTransformer(
                function ($rolesArray) {
                     // transform the array to a string
                     return count($rolesArray)? $rolesArray[0]: null;
                },
                function ($rolesString) {
                     // transform the string back to an array
                     return [$rolesString];
                }
        ));
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }
}

无需触摸控制器。 我添加了整个文件以查看您需要导入的类