FOSUserBundle Symfony2:两个学说表

时间:2014-10-23 22:20:12

标签: symfony doctrine fosuserbundle

我正在使用FOSUserBundle开发我的网站项目,我想知道(以及如何)为用户注册设置两个不同的表。我想以这种方式这样做,因为我认为在表中设置管理员和在另一个表中设置用户会更容易。

我保持开放的态度,所以如果你认为我的决定不对,那么如果你给我提供另一种方法来获得它,那就太棒了。

感谢阅读。

1 个答案:

答案 0 :(得分:1)

我认为您可以通过定义自定义用户提供程序(一个将检索您的用户实体的类,给定用户名:How to Create a custom User Provider

来执行您想要的操作

话虽如此,我不确定这是一个做你想做的事情的好方法,因为你将有几个表中的信息(电子邮件,密码......)。

我会做一些不同的事情:创建一个管理员实体,该实体将存储有关管理员的设置(对此及其他权利等)并在用户<之间建立关系/ strong>实体(将单独存储用户名/密码...)和管理员实体。如果用户是普通用户,则此关系将 NULL ,但如果是管理员,则它将链接到管理员实体。更多细节:

我认为您根据FOSUserBundle documentation设置了用户实体。只需将OneToOne关系添加到管理员实体即可。

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="Acme\UserBundle\Entity\Administrator", inversedBy="user")
     */
    private $administrator;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }

    public function getAdministrator()
    {
        return $this->administrator;
    }

    public function setAdministrator(Acme\UserBundle\Entity\Administrator $administrator)
    {
        $this->administrator = $administrator;
        $adinistrator->setUser($this);

        return $this;
    }
}

管理员实体将保留您管理应用程序权限所需的所有字段。例如,一个布尔值,表明该管理员是否可以删除帖子:

<?php
// src/Acme/UserBundle/Entity/Administrator.php

namespace Acme\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="Administrator")
 */
class Administrator
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="Acme\UserBundle\Entity\User", mappedBy="administrator")
     */
    private $user;

    /**
     * @var boolean
     *
     * @ORM\Column(name="canDeletePosts", type="boolean")
     */
    private $canDeletePosts;

    // And all the fields you need !

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }

    public function getUser()
    {
        return $this->user;
    }

    public function setUser(Acme\UserBundle\Entity\User $user)
    {
        $this->user = $user;

        return $this;
    }

    public function setCanDeletePosts($canDeletePosts)
    {
        $this->canDeletePosts = $canDeletePosts;

        return $this;
    }

    public function getCanDeletePosts()
    {
        return $this->canDeletePosts;
    }
}

当您将用户提升为管理员时,请不要忘记创建管理员并将其链接到用户实体。然后,在管理控制器中,如果用户是管理员,您可以执行以下操作:

$canDeletePosts = $this->getUser()->getAdministrator()->getCanDeletePosts();
if ($canDeletePosts)
{
    // Remove the post
}