symfony 无法获取读取类“App\Entity\User”中属性“user”的方法

xdnvmnnf  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(134)

我制作了一个表单,以便在选择用户时,其角色从[“ROLE_USER”]更改为[“ROLE_ADMIN”]。提交表单时,出现以下错误:Can't get a way to read the property "user" in class "App\Entity\User".
我知道这肯定是因为User类中没有名为user的字段,但我不知道用哪个字段替换user。我已经尝试了nameroles,但它们都不起作用。
如何选择用户并简单地更改其角色?

管理类型.php

<?php

namespace App\Form\Admin;

use App\Entity\User;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class AdminType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('user', EntityType::class, [
                'class' => User::class,
                'choice_label' => 'name',
                'query_builder' => function (EntityRepository $er) {
                    return $er->createQueryBuilder('u')
                        ->andWhere('u.roles LIKE :role')
                        ->setParameter('role', '["ROLE_USER"]')
                        ->orderBy('u.firstname', 'ASC');
                },
                'placeholder' => 'J\'ajoute un administrateur',
            ])
            ->add('save', SubmitType::class, [
                'attr' => ['class' => 'save'],
            ])
        ;
    }

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

管理控制器.php

<?php

namespace App\Controller\Admin;

use App\Form\Admin\AdminType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class AdminController extends AbstractController
{
    #[Route('/admin/list', name: 'admin')]
    public function admin(
        Request $request, 
        UserRepository $userRepository,
        EntityManagerInterface $entityManagerInterface
    ){   
        $admins = $userRepository->admin();
        
        $form = $this->createForm(AdminType::class);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $user = $form->get('user')->getData();
            $user->setRoles(["ROLE_ADMIN"]);

            $entityManagerInterface->persist($user);
            $entityManagerInterface->flush();

            return $this->redirectToRoute('admin');
        }

        return $this->renderForm('admin/user/admin.html.twig', [
            'admins' => $admins,
            'form' => $form
        ]);
    }
vwoqyblh

vwoqyblh1#

简短回答

AdminType表单中的configureOptions中删除'data_type' => User::class

说明

将表单的data_type设置为User实体将导致Symfony尝试创建User对象,并将其user属性设置为表单的user字段中的值(您可以通过$form->get('user')获得)。这就是为什么错误消息会告诉您,它无法找到读取(然后覆盖)User类上的user属性的方法。
删除data_type意味着表单的数据类型只是一个数组(默认值),您也可以显式设置null
如果窗体的数据类型是数组,则只设置该数组中的user键。
因为表单的user字段是EntityType类型,它已经确保了表单的user字段的值必须是那个类(User实体)。因为您只想 * 选择 * 一个用户,然后添加一个角色,我假设表单不需要用户data_type

相关问题