Sofiane Bensliman
Sofiane Bensliman

Reputation: 23

EntityType form returns a String instead of object

I have a user entity that has a many-to-many relationship with another entity Roles.

I have a form that allows me to create a new user and for that, I use an EntityType for the manyToMany relationship 'roles'.

Here is my form

$builder
    ->add('username',null,['label' => 'Email'])
    ->add('password',null,['label'=>'Password'])
    ->add('roles',EntityType::class, [
        'multiple' => true,
        'class' => Role::class,
        'choice_label' => 'role_name',
        ]
    )
;

Everything works fine but when I submit the form I got this error:

Expected argument of type "App\Entity\Role", "string" given at property path "roles".

EDIT:

here is my User entity :

<?php

namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $username;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $password;

    /**
     * @ORM\ManyToMany(targetEntity=Role::class, inversedBy="users")
     */
    private $roles;

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


    public function getId(): ?int
    {
        return $this->id;
    }

    public function getUsername(): ?string
    {
        return $this->username;
    }

    public function setUsername(string $username): self
    {
        $this->username = $username;

        return $this;
    }

    public function getPassword(): ?string
    {
        return $this->password;
    }

    public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }


    public function getRoles()
    {
        return ['ROLE_ADMIN'];
    }

    public function getSalt()
    {
        return null;
    }

    public function eraseCredentials()
    {

    }


    public function addRole(Role $role): self
    {
        if (!$this->roles->contains($role)) {
            $this->roles[] = $role;
            $role->addUser($this);
        }

        return $this;
    }

    public function removeRole(Role $role): self
    {
        if ($this->roles->contains($role)) {
            $this->roles->removeElement($role);
            $role->removeUser($this);
        }

        return $this;
    }


}

Here is my Role entity :

<?php

namespace App\Entity;

use App\Repository\RoleRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=RoleRepository::class)
 */
class Role
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $role_name;

    /**
     * @ORM\ManyToMany(targetEntity=User::class, mappedBy="roles")
     */
    private $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getRoleName(): ?string
    {
        return $this->role_name;
    }

    public function setRoleName(string $role_name): self
    {
        $this->role_name = $role_name;

        return $this;
    }

    /**
     * @return Collection|User[]
     */
    public function getUsers(): Collection
    {
        return $this->users;
    }

    public function addUser(User $user): self
    {
        if (!$this->users->contains($user)) {
            $this->users[] = $user;
        }

        return $this;
    }

    public function removeUser(User $user): self
    {
        if ($this->users->contains($user)) {
            $this->users->removeElement($user);
        }

        return $this;
    }
}

Upvotes: 0

Views: 991

Answers (2)

Д И
Д И

Reputation: 11

what if i'm using ArrayCollection in User entity?

/**
 * @var Collection|Role[]
 * @ORM\ManyToMany(targetEntity="App\Entity\Role")
 * @ORM\JoinTable(
 *     name="user_roles",
 *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
 * )
 */
private $roles;

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

public function getRoles()
{
    return $this->roles;
}

Upvotes: 1

SlimenTN
SlimenTN

Reputation: 3564

I guess the problem is here

 public function getRoles()
    {
        return ['ROLE_ADMIN'];
    }

you should return an array or Role entity not string, it should be something like this

 public function getRoles()
    {
        return $this->roles;
    }

Upvotes: 2

Related Questions