使用FOSUserBundle在Symfony2中访问控制列表 - 向用户添加角色

时间:2013-08-01 23:19:50

标签: symfony doctrine-orm entity acl fosuserbundle

我希望这比我读过的文档更简单。

我有许多与标准FOSUserbundle用户实体具有ManyToOne关系的实体,可以登录用户,注册用户,注销等。

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

    public function __construct()
    {
        parent::__construct();
    }

我的每个用户也可以拥有许多宠物。即这是猫实体(简化):

class Cat
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     **/
    private $user_id;

我应该如何添加一个访问控制列表用户角色来定义用户是否有任何猫,如果他们这样做,则允许他们进入我网站的“仅猫”部分。

注意(略有关联):在使用原则进行数据库设计时,我感到温和迟钝,我会向所有人提出任何可以指导我使用不同类型连接设计事物的良好教程/解释的人,特别是如果它是在Symfony / Doctrine环境中。

1 个答案:

答案 0 :(得分:0)

好吧,既然你还没有得到任何其他东西。我会抛出一些东西但到目前为止我的经验只是温和的。

在您的猫主人页面的控制器中,您可以查询用户是否有任何关联的猫实体。

您需要向用户和cat类添加OneToMany / ManyToOne注释,并为关联添加变量。你可以直接从symfony2书的学说部分中查看(如果你正在使用Symfony2并且没有花时间阅读这本书,那就是使用完整堆栈的最低知识水平,我建议你读完了全部)。 (你真的需要一个只用于猫的实体类,你可以拥有一个带有“类型”选项的宠物实体。)

检查安全上下文以确保登录,然后查询db。

    $em = $this->getDoctrine()->getManager();

    $ownersCats = $em->getRepository('PetsPetSiteBundle:Blog')->findBy(array('type'=>'cat'));

或只有一个结果

    $ownersCats = $em->getRepository('PetsPetSiteBundle:Blog')->findOneBy(array('type'=>'cat'));

一旦你得到这个结果,如果它回来假,你知道他没有猫。否则继续。

显然,如果您不打算使用该页面上的实体或只是执行计数查询并查看它是否大于0,您可以仅通过查询id或其他内容来提高性能吗?

相关问题