Doctrine - 自动插入行关联表

时间:2017-01-20 15:11:51

标签: mysql doctrine-orm symfony

我有3个表:Profile - Permission - ProfilePermissionValue

Profile和Permission是经典实体,ProfilePermissionValue是Profile.id,Permission.id和表示配置文件权限值的额外字段的关联。​​

当我添加一个Permission时,我希望在ProfilePermissionValue中为每个Profile添加一个新行。 反过来相同,当我添加一个新的配置文件时,......顺便删除时也一样。

问题:是否有办法使用Doctrine(Symfony 3)功能,或者我需要自己编写代码?

1 个答案:

答案 0 :(得分:1)

我认为你看一下权限< - >比你应该更严格的配置文件。基本上在我工作的几乎每一个ACL中都有一个假设 - 当不允许某些东西时,它被禁止(或者当不允许某些东西被允许时更加危险)。这显着减少了数据量,您必须保存。

所以当你创建像这样的实体时

<?php

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class Permission
{

    // id column

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



    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

}

<?php

use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 */
class User
{

    // id column

    // name column

    /**
     * @ORM\ManyToMany(targetEntity=Permission::class)
     * @ORM\JoinTable(name="allowed_permissions",
     *        joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *        inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
     *    )
     * @var Permission[]|Collection
     */
    private $allowedPermissions;



    /**
     * @return Permission[]
     */
    public function getAllowedPermissions()
    {
        return $this->allowedPermissions->toArray();
    }

}

您可以简单地为接口AuthorizationCheckerInterface实现自己的类

<?php

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class Authorizator implements AuthorizationCheckerInterface
{

    /**
     * @param string $name
     * @param User $user
     * @return bool
     */
    public function isGranted($name, $user)
    {
        foreach ($user->getAllowedPermissions() as $permission) {
            if ($permission->getName() === $name) {
                return TRUE;
            }
        }

        return FALSE;
    }

}

无需在数据库中拒绝权限。