2013-11-29 2 views
1

Я пытаюсь настроить мой пользователь энтитю роли, и после документации на http://symfony.com/doc/current/cookbook/security/entity_provider.htmlSymfony2 Doctrine - Извлечение Роли пользователей

Пользователи работают нормально, и если я жёстко в $ ролей дорожат все работает, как ожидалось , вход в систему/выход хорош и т. д. Но если я попытаюсь получить роли через отношения «многие ко многим», как указано в документации, я вернусь к нулю.

Следует также упомянуть, что после создания сущностей при запуске «php app/console doctrine: schema: update -force» она создала таблицу ролей, но не таблицу «user_role», как она говорила. Я пошел вперед и создал его вручную и ввел строку для пользователя, с которым я тестировал, но это был мой первый ключ, что-то не работало. Это действительно расстраивает, потому что я следил за документацией, и похоже, что она должна работать.

Я получаю ошибку назад при попытке войти в это:

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

Что указывает на return $this->roles->toArray() в объекте пользователя.

Мой Entity Пользователь (соответствующие биты):

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

Моя роль 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; 
    } 
} 

Видит кто-нибудь проблема в моем коде или иметь опыт работы с этим же вопросом? Я застрял в данный момент.

ответ

1

В вашей сущности роли у вас есть

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

изменить его к

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

, потому что ваше имя таблицы USER_ROLE не роль

+0

Объект Role связан с ролью таблицы. Таблица user_role - это таблица многих ко многим, которая содержит только user_id и role_id. – spacebean

+0

это возврат $ this-> getRoles-> toArray() или возврат $ this-> role-> toArray() –

+0

Извините, это 'return $ this-> role-> toArray()', как показано в объекте. – spacebean

0

Я была такая же problème и я удалил METHODE ToArray

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(); 
    } 
... 
} 
Смежные вопросы