我正在使用FOSUserBundle开发我的网站项目,我想知道(以及如何)为用户注册设置两个不同的表。我想以这种方式这样做,因为我认为在表中设置管理员和在另一个表中设置用户会更容易。
我保持开放的态度,所以如果你认为我的决定不对,那么如果你给我提供另一种方法来获得它,那就太棒了。
感谢阅读。
答案 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
}