Home > Mobile >  Can't get a way to read the property "user" in class "App\Entity\User"
Can't get a way to read the property "user" in class "App\Entity\User"

Time:11-06

I made a form so that when a user is selected, his role changes from ["ROLE_USER"] to ["ROLE_ADMIN"]. When form is submitted, I have the following error : Can't get a way to read the property "user" in class "App\Entity\User".

I understand it must come the fact there is no such field named user in the User class, but I don't know with which field I can replace user. I already tried name or roles, but it doesn't work either with them.

How can I select a user and simply change his role ?

AdminType.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'
        ]);
    }
}

AdminController.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
        ]);
    }

CodePudding user response:

Short answer

remove 'data_type' => User::class from configureOptions in your AdminType form.

Explanation

Setting the data_type of the form to the User entity will cause Symfony to try to create a User object and set its user Property to the value in the form's user field (which you get via $form->get('user')). That's why the error message tells you, that it can't find a way to read (to then overwrite) the property user on the User class.

Removing the data_type will then mean, that the form's data type is just an array (the default), you could also explicitly set null.

If the form's data type is an array, it'll just set the user key in that array.

Since your form's user field is of type EntityType, with a given class, it already ensures that the form's user field's value must be of that class (the User entity). And since you only want to select a user, to then add a role, I assume that the form doesn't need the User data_type.

  • Related