Symfony2\Doctrine - 检索用户角色

Posted

技术标签:

【中文标题】Symfony2\\Doctrine - 检索用户角色【英文标题】:Symfony2\Doctrine - Retrieving User RolesSymfony2\Doctrine - 检索用户角色 【发布时间】:2013-11-29 13:51:33 【问题描述】:

我正在尝试设置我的用户实体以使用角色,并遵循http://symfony.com/doc/current/cookbook/security/entity_provider.html 上的文档

用户工作正常,如果我对 $roles 值进行硬编码,一切都按预期工作,登录/注销就很好,等等。但是,如果我尝试通过多对多关系检索角色,如文档我返回 null。

我还应该提到,在创建实体后,当我运行“php app/console dictionary:schema:update --force”时,它创建了角色表,而不是它所说的“user_role”表。我继续手动创建它并为我正在测试的用户输入一行,但这是我的第一个线索,有些东西不起作用。这真的很令人沮丧,因为我按照文档进行了操作,看起来它应该可以工作。

我在尝试登录时返回的错误是:

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

在用户实体中指向return $this->roles->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->toArray();
    
 ...

我的角色实体:

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 而不是角色

【讨论】:

角色实体与表“角色”相关。表'user_role'是只包含user_id和role_id的多对多表。 是返回 $this->getRoles->toArray() 还是返回 $this->roles->toArray() 对不起,它在实体中显示为 'return $this->roles->toArray()'。【参考方案2】:

我有同样的问题,我删除了 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();
    
 ...

【讨论】:

以上是关于Symfony2\Doctrine - 检索用户角色的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2/Doctrine 提交表单需要很长时间

Symfony2 Doctrine2 获取所有表

Symfony2/Doctrine - 与普通 SQL 相关的实体抽象

Symfony2,Doctrine,fixtures,数组到字符串的转换

Symfony2 - Doctrine - 在实体管理器刷新调用中捕获错误

Symfony2 / Doctrine2:不要在模式上删除全文索引:更新