spacebean
spacebean

Reputation: 1554

Symfony2\Doctrine - Retrieving User Roles

I'm trying to set up my User entity to use roles, and following the documentation at http://symfony.com/doc/current/cookbook/security/entity_provider.html

Users work fine, and if I hardcode the $roles value everything works as expected, log in/out is good, etc. But, if I try and retrieve the roles through a many-to-many relationship as outlined in the documentation I get back null.

I should also mention that after creating the entities when I ran 'php app/console doctrine:schema:update --force' it created the role table, but not the 'user_role' table as it said it would. I went ahead and created it manually and entered a row for the user I was testing with, but that was my first clue something wasn't working. It's really frustrating because I followed the documentation and it looks like it should work.

The error I get back while trying to log-in is:

FatalErrorException: Error: Call to a member function toArray() on a non-object

Which points to return $this->roles->toArray() in the user entity.

My User Entity (the relevant bits):

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="ACME\MyBundle\Entity\UserRepository")
 *
*/

class User implements UserInterface, \Serializable
{

 ...
      /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     *
     */
    private $roles;
...
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->roles = new ArrayCollection();
    }

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

My Role Entity:

use Symfony\Component\Security\Core\Role\RoleInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(name="role")
 * @ORM\Entity()
 */
class Role implements RoleInterface
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @ORM\Column(name="role", type="string", length=20, unique=true)
     */
    private $role;

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

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

    /**
     * @see RoleInterface
     */
    public function getRole()
    {
        return $this->role;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Role
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set role
     *
     * @param string $role
     * @return Role
     */
    public function setRole($role)
    {
        $this->role = $role;

        return $this;
    }
}

Does anybody see a problem in my code or have experience with this same issue? I'm stuck at the moment.

Upvotes: 1

Views: 1426

Answers (2)

Chopchop
Chopchop

Reputation: 2949

I had the same probleme and i removed the toArray methode

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="ACME\MyBundle\Entity\UserRepository")
 *
*/

class User implements UserInterface, \Serializable
{

 ...
      /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     *
     */
    private $roles;
...
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->roles = new ArrayCollection();
    }

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

Upvotes: 0

Lamari Alaa
Lamari Alaa

Reputation: 158

In your entity Role you have

 * @ORM\Table(name="role")

change it to

* @ORM\Table(name="user_role")

because your table name is user_role not role

Upvotes: 1

Related Questions